BCrypt를 사용하여 해시 된 암호를 데이터베이스에 저장하고 싶습니다. 이것에 적합한 유형은 무엇이며 올바른 길이는 무엇입니까? BCrypt로 해시 된 비밀번호는 항상 같은 길이입니까?
편집하다
해시 예 :
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
일부 암호를 해시 한 후 BCrypt는 항상 60 자 해시를 생성하는 것으로 보입니다.
편집 2
BCrypt를 사용하여 해시 된 암호를 데이터베이스에 저장하고 싶습니다. 이것에 적합한 유형은 무엇이며 올바른 길이는 무엇입니까? BCrypt로 해시 된 비밀번호는 항상 같은 길이입니까?
편집하다
해시 예 :
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
일부 암호를 해시 한 후 BCrypt는 항상 60 자 해시를 생성하는 것으로 보입니다.
편집 2
답변:
bcrypt의 모듈 식 암호화 형식은
$2$
, $2a$
또는 $2y$
식별 해시 알고리즘 및 형식$
.
, /
, 0
- 9
, A
- Z
, a
- z
받는 다르다고 표준베이스 64 인코딩 알파벳)로 이루어진 :
따라서 총 길이는 각각 59 또는 60 바이트입니다.
2a 형식을 사용하면 60 바이트가 필요합니다. 따라서 MySQL을 위해 나는를 사용하는 것이 좋습니다 것 CHAR(60) BINARY
또는BINARY(60)
(참조 _bin 와 바이너리 데이터 정렬 의 차이에 대한 정보를).
CHAR
이진 안전이 아니며 동등성은 바이트 값에만 의존하는 것이 아니라 실제 데이터 정렬에 의존합니다. 최악의 경우 A
는로 취급됩니다 a
. 자세한 내용 은 _bin
및 binary
데이터 정렬 을 참조하십시오.
SQL_Latin1_General_CP1_CS_AS
는 MySQL에서 알려져 있지 않습니다. 알려진 것은 latin1_general_cs
입니다.
2
, 2a
및 2y
해시 알고리즘 및 형식에 대한 의미한다. 몇 가지 검색으로 쉬운 답변을 찾지 못했습니다.
Bcrypt 해시는 BINARY(40)
열에 저장 될 수 있습니다 .
BINARY(60)
다른 답변에서 알 수 있듯이 가장 쉽고 자연스러운 선택이지만 스토리지 효율성을 극대화하려면 해시를 무손실로 해체하여 20 바이트를 절약 할 수 있습니다. 나는 이것을 GitHub에 더 철저하게 문서화했다 : https://github.com/ademarre/binary-mcf
Bcrypt 해시는 모듈 식 암호화 형식 (MCF)이라고하는 구조를 따릅니다. 이진 MCF (BMCF)는 이러한 텍스트 해시 표현을보다 간결한 이진 구조로 디코딩합니다. Bcrypt의 경우 결과 이진 해시는 40 바이트입니다.
Gumbo는 Bcrypt MCF 해시의 4 가지 구성 요소를 잘 설명했습니다.
$<id>$<cost>$<salt><digest>
BMCF 로의 디코딩은 다음과 같습니다.
$<id>$
3 비트로 표현 될 수있다.<cost>$
, 04-31은 5 비트로 표시 될 수 있습니다. 이것들을 1 바이트로 합치십시오.1 + 16 + 23
위의 링크에서 자세한 내용을 읽거나 GitHub에서 PHP 구현을 검사 할 수 있습니다.
bcrypt 해시를 생성하기 password_hash()
위해 PASSWORD_DEFAULT
알고리즘 과 함께 PHP를 사용하는 경우 (이 질문을 읽는 사람들의 대다수라고 가정 할 것입니다.) 앞으로 password_hash()
다른 알고리즘을 기본값으로 사용할 수 있으므로이를 염두에 두십시오. 해시의 길이에 영향을 미칩니다 (그러나 반드시 더 길지는 않을 수도 있습니다).
매뉴얼 페이지에서 :
이 상수는 새롭고 강력한 알고리즘이 PHP에 추가됨에 따라 시간이 지남에 따라 변경되도록 설계되었습니다. 따라서이 식별자를 사용한 결과의 길이는 시간이 지남에 따라 변경 될 수 있습니다. 따라서 결과를 60 자 이상으로 확장 할 수있는 데이터베이스 열에 저장하는 것이 좋습니다 (255 자 선택이 좋습니다).
255 바이트 암호 해시를 저장하는 10 억 명의 사용자 (즉, 현재 페이스 북과 경쟁하고 있음)가 있더라도 bcrypt를 사용하면 작은 SSD 하드 드라이브 크기와 비슷한 ~ 255GB의 데이터 만 남게됩니다. 암호 해시 저장이 응용 프로그램의 병목 현상이 될 가능성은 거의 없습니다. 그러나 스토리지 공간이 어떤 이유로 든 실제로 문제 가 될 가능성이 있지만 기본값이 아닌 경우에도 bcrypt PASSWORD_BCRYPT
를 강제 password_hash()
로 사용하는 데 사용할 수 있습니다 . 새로운 PHP 버전이 출시 될 때마다 bcrypt에서 발견 된 취약점에 대한 정보를 유지하고 릴리스 정보를 검토하십시오. 기본 알고리즘이 변경된 경우 이유 를 검토 하고 새 알고리즘의 사용 여부에 대한 정보를 바탕으로 결정을 내리는 것이 좋습니다.
MD5 해시와 같이이를 저장할 수있는 깔끔한 트릭이 있다고 생각하지 않습니다.
가장 좋은 방법 CHAR(60)
은 항상 60 자 이므로 그대로 저장하는 것입니다.