bcrypt와 함께 소금을 보관해야합니까?


189

bCrypt의 javadoc 에는 비밀번호를 암호화하는 방법에 대한 다음 코드가 있습니다.

String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); 

일반 텍스트 비밀번호가 이전에 해시 된 비밀번호와 일치하는지 확인하려면 checkpw 메소드를 사용하십시오.

if (BCrypt.checkpw(candidate_password, stored_hash))
    System.out.println("It matches");
else
    System.out.println("It does not match");

이 코드 스 니펫은 무작위로 생성 된 소금이 버려짐을 나타냅니다. 이것이 사실입니까, 아니면 잘못된 코드 스 니펫입니까?

답변:


214

솔트는 해시에 포함됩니다 (base64 스타일 형식으로 인코딩 됨).

예를 들어, 전통적인 유닉스 암호에서 솔트는 암호의 처음 두 문자로 저장되었습니다. 나머지 문자는 해시 값을 나타냅니다. 검사기 기능은 이것을 알고 해시를 당겨 소금을 다시 가져옵니다.


59
소금은 암호에 포함되어 있습니다. 따라서 소금을 구할 필요가 없습니다.
Swapnonil Mukherjee

2
고마워 나는 그들이 javadoc는 :)에 (-하지만 난 내가 전에 찾고 있었는지 몰랐다 나는 소스를 쳐다 보면서 확인했습니다)라고 할
RodeoClown

1
감사합니다-나는 이것을 알아 내려고 노력했습니다! 이제 이것이 좋은 아이디어인지 궁금합니다. 소금을 별도로 저장하는 것보다 해시에 소금을 보관하는 것의 장점 / 단점이 있습니까?
Adam

8
@Adam-소금이 무작위로 생성되므로 데이터베이스에 두 가지를 연결하는 방법이 필요하지 않습니다.
RodeoClown

소스 코드를 살펴본 후 salt 인수에 대한 JavaDoc이 "BCrypt.gensalt를 사용하여 생성 된 것"이지만 genSalt () 메소드를 사용해야하거나 예외가 발생한다는 것을 발견했습니다. = /
the_new_mr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.