문제

나는 읽은 후 bcrypt.net을 우연히 발견했습니다 비밀번호 저장에 대한 Jeff Atwood의 게시물 이로 인해 Thomas Ptacek의 추천으로 이끌었습니다 bcrypt를 사용하십시오 비밀번호를 저장합니다. 마침내 나를 이끌었습니다 이 c# bcrypt 구현

위의 마지막 링크에 대한 의견에서 누군가가 "GeneratesAlt (30)가 왜 영원히 가져 가는가? 그러나 GeneratesAlt (31)는 전혀 시간이 걸리지 않는 것 같습니다."

나는 bcrypt.hashpassword (Password, Bcrypt.generatesalt (31))를 실행하여 0 밀리 초로 내 결과를 얻었습니다.

Bcrypt.hashpassword ( "Password", Bcrypt.generatesalt (30))를 5 분 이상 실행했지만 여전히 결과가 없습니다.

비밀번호 해시를 만들기 위해 무작위로 생성 된 30 개의 문자 소금이 필요하지 않을 것입니다. Bcrypt의 경우 돌이킬 수없는 암호화) 수년간. 편집하다 코드를 조금 읽었어야합니다. Logrounds는 소금 길이와 관련이 없습니다. 감사합니다 aaronaught.

그렇다면 GeneratesAlt (31)가 값을 거의 즉시 반환하는 이유 (GeneratesAlt (30)보다 약 2 배가 걸리는가?

업데이트

다음은 수정 사항입니다.

private byte[] CryptRaw(byte[] password, byte[] salt, int logRounds) {
    // ... snip ...
    uint rounds = 1U << logRounds;
    // ... snip
}
도움이 되었습니까?

해결책

버그가 여기에 있다고 생각합니다.

private byte[] CryptRaw(byte[] password, byte[] salt, int logRounds) {
    // ... snip ...
    int rounds = 1 << logRounds;
    // ... snip
}

31을 지정할 때 logRounds, 그것은 2^32로 계산되며, int 그리고 오버플로, 따라서 해시는 실제로 ... er, Zero Pass에서 수행됩니다. 저자는 사용해야했습니다 uint 대신에. 쉽게 해결할 수 있습니다!


또한 이것에 대해 언급하고 싶었습니다.

암호 해시를 만들기 위해 무작위로 생성 된 30 자 소금이 필요하지 않을 것입니다.

주목하십시오 logRounds 매개 변수는 항상 16 인 소금의 문자/바이트 수를 참조하지 않습니다. 해시가 계산하기 위해 취할 패스 수의 로그베이스를 나타냅니다. 다시 말해, 그것은 Moore의 법칙으로 Bcrypt 규모를 만드는 방법으로 컴퓨터가 기존 해시를 깨뜨릴 정도로 빠르게 빠르게 작동하는 경우 몇 배의 컴퓨팅 비용이 더 비쌉니다.

다른 팁

해싱이 있다면 GenerateSalt(31) 거의 즉시 반환됩니다. 그것은 버그입니다. 상류 (JBCrypt의 경우)를보고해야합니다. :-)

기본적으로 로그 라운드는 10입니다. 이는 (올바르게 기억한다면) 1024 라운드가 사용됨을 의미합니다. 로그 라운드를 증가시킬 때마다 라운드 수가 두 배가됩니다.

30 개의 로그 라운드에서 1073741824 라운드를하고 있습니다. 정당하게 시간이 걸립니다. 31 개의 로그 라운드에서 2147483648 라운드가 수행되어야하지만 오버플로를 사용하는 특정 구현이 대신 사용되는 것으로 생각됩니다. :-(

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top