2015-01-02 17 views
2

bcryptjs을 사용하여 사용자 비밀번호의 해시를 생성하려고합니다. 그러나 나는 한 가지 문제로 약간 혼란 스럽다.왜 비교 문자열에 소금 문자열이 필요하지 않습니까?

종래에는 this 기사에 따르면, 우리는 필요 에 :

  • 우리의 암호 해시 비교적 긴 고유의 소금,
  • 해시이 소금
  • 저장합니다 소금과 소금에 절인 사용자 암호를 유지 소금과 함께 해시 된 암호

그래서 사용자를 인증하는 동안 해시를 비교할 때 저장된 소금을 사용자가 입력 한 p에 추가합니다 assword를 입력하고 데이터베이스의 해시와 비교합니다. 우리가 인증하는 동안 소금을 필요가없는 경우

//hashSync to generate hash 
var bcrypt = require('bcryptjs'); 
var password = "abc"; 
var hash = bcrypt.hashSync(<some string>, < integer length of salt>) // the salt of mentioned length(4-31) is self-generated which is random and fairly unique 

//compareSYnc to compare hash 
var testString="abc"; 
console.log(bcrypt.compareSync(testString, hash)) // compares with previously generated hash returns "true" in this case. 

내가 혼란 스러워요 것은 그것을 생성의 의미는 무엇인가,이다 다음과 같이

그러나 hashSync 및 bcryptjs의 compareSync를 사용하고 계십니까? compareSync는 소금이 없으면 true을 반환합니다. 그래서 그것은 비교적 작은 암호에 대한 bruteforce 공격을 쉽게 만들지 않을 것입니까? 소금 크기에 상관없이 다음 사항이 모두 참입니다.

console.log(bcrypt.compareSync("abc", bcrypt.hashSync("abc"))); // consoles true. by default, if salt size is not mentioned, size is 10. 
console.log(bcrypt.compareSync("abc", bcrypt.hashSync("abc", 4))); //consoles true 
console.log(bcrypt.compareSync("abc", bcrypt.hashSync("abc", 8))); //consoles true 
console.log(bcrypt.compareSync("abc", bcrypt.hashSync("abc", 32))); //consoles true 
console.log(bcrypt.compareSync("ab", bcrypt.hashSync("abc", 4))); //consoles false 

혼란에 대해 충분히 설명하기를 바랍니다.

답변

3

bcrypt 표준을 사용하면 소금을 쉽게 저장할 수 있습니다. 암호를 확인하는 데 필요한 모든 것이 출력 문자열에 저장됩니다.

섀도우 암호 파일의 해시 문자열에있는 접두사 "$ 2a $"또는 "2y"는 해시 문자열이 모듈러 암호 형식의 bcrypt 해시임을 나타냅니다. 해시 문자열의 나머지 부분에는 비용 매개 변수, 128 비트 salt (base-64는 22 문자로 인코딩 됨) 및 192 비트 [모호한 토론] 해시 값 (base-64는 31 문자로 인코딩 됨)이 포함됩니다.

That 's from the Wikipedia page on bcrypt입니다.

+0

위의 기사에서 언급했듯이 소금에 대한 나의 이해는 원래 암호와 연결되기 때문에 매우 짧은 암호조차도 무차별 공격을 사용하여 해독하기가 어렵습니다. 예 : 암호가 "a"이고 소금의 길이가 32자인 경우 bruteforce가 33자를 처리해야합니까? bcrypt를 사용하면 소금이 저장되어 있지 않으면 소금 길이에 관계없이 원래의 문자가 일치합니다. 먼저 "a"가 소금 길이에 관계없이 참을 때와 같습니다. 무지개 테이블과 역방향 조회 테이블 공격을 막을 경우를 제외하고는 bcrypt가 저장되지 않은 경우 소금 사용이 무엇입니까? – Pravin

+3

@Pravin 1 문자 암호와 33 문자 암호를 해시하는 것의 차이는 거의 없습니다. 소금은 저장됩니다. 해시를 포함하는 동일한 문자열에 저장됩니다. 소금은 무지개 공격 만 막아줍니다. 그게 전부입니다. –

+0

을 사용하면 더 명확하게 알 수 있습니다. 감사. – Pravin

관련 문제