[mysql] Bcrypt 해시 비밀번호를 데이터베이스에 저장하기 위해 어떤 열 유형 / 길이를 사용해야합니까?

BCrypt를 사용하여 해시 된 암호를 데이터베이스에 저장하고 싶습니다. 이것에 적합한 유형은 무엇이며 올바른 길이는 무엇입니까? BCrypt로 해시 된 비밀번호는 항상 같은 길이입니까?

편집하다

해시 예 :

$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu

일부 암호를 해시 한 후 BCrypt는 항상 60 자 해시를 생성하는 것으로 보입니다.

편집 2

구현을 언급하지 않아서 죄송합니다. jBCrypt 사용 하고 있습니다.



답변

bcrypt의 모듈 식 암호화 형식은

  • $2$, $2a$또는 $2y$식별 해시 알고리즘 및 형식
  • 비용 매개 변수를 나타내는 두 자리 숫자 값 $
  • 53 문자 길이 값베이스 64 인코딩 (그들은 문자를 사용하여 ., /, 09, AZ, az받는 다르다고 표준베이스 64 인코딩 알파벳)로 이루어진 :
    • 22 문자의 소금 (실제로 128 비트의 132 디코딩 비트)
    • 31 자의 암호화 된 출력 (186 개의 디코딩 된 비트 중 184 비트 만 유효)

따라서 총 길이는 각각 59 또는 60 바이트입니다.

2a 형식을 사용하면 60 바이트가 필요합니다. 따라서 MySQL을 위해 나는를 사용하는 것이 좋습니다 것 CHAR(60) BINARY또는BINARY(60) (참조 _bin바이너리 데이터 정렬 의 차이에 대한 정보를).

CHAR이진 안전이 아니며 동등성은 바이트 값에만 의존하는 것이 아니라 실제 데이터 정렬에 의존합니다. 최악의 경우 A는로 취급됩니다 a. 자세한 내용 _binbinary데이터 정렬 을 참조하십시오.


답변

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 로의 디코딩은 다음과 같습니다.

  1. $<id>$ 3 비트로 표현 될 수있다.
  2. <cost>$, 04-31은 5 비트로 표시 될 수 있습니다. 이것들을 1 바이트로 합치십시오.
  3. 22 자의 솔트는 128 비트의 비표준 base-64 표현입니다. Base-64 디코딩은 16 바이트를 생성합니다.
  4. 31 자 해시 다이제스트는 base-64를 23 바이트로 디코딩 할 수 있습니다.
  5. 40 바이트를 모두 합치십시오. 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 자 이므로 그대로 저장하는 것입니다.


답변