2014-02-20 5 views
9

비록 해싱 및 소금 암호를 이해하지만 그것은 몇 가지 오해가 보인다. nodejs에있는 내 웹 사이트의 사용자 계정 시스템을 만들고 있습니다.어떻게 암호 해시 + 소금 작동합니까

내가 이해하는 방식은 사용자가 암호를 생성 할 때 임의의 소금을 생성하고 암호에 추가 한 다음 해당 문자열을 해시하는 것입니다. 또한 작업 요소를 추가하여 해시 작업을 천천히하고 무차별 공격을 방어 할 수 있습니다. 우리는 데이터베이스에 해시와 함께 소금을 저장하고 로그인 시도의 유효성을 확인하기 위해 저장된 소금과 시도 된 암호로 위의 과정을 반복하고 해시가 일치하는지 확인합니다.

nodejs의 bcrypt 모듈이 해싱에 대한 나의 해석과 일치하지 않는 것으로 보입니다. 이

var salt = bcrypt.genSaltSync(10); 
var hash = bcrypt.hashSync("my password", salt); 

첫째 이유 일 계수가 소금보다는 해시에 적용되는 http://codetheory.in/using-the-node-js-bcrypt-module-to-hash-and-safely-store-passwords/의 예에서 무엇입니까? 무차별 공격으로 누군가가 해시 함수를 실행하면 올바른가? 해쉬가 우리가 느리게 할 필요가있는 함수가 아닌가?

나는 또한 bcrypt과 검증에 의해 혼동 해요 :

bcrypt.compareSync("my password", hash); 

우리는 두 사용자가 동일한 암호를 선택한 경우에도 고유하게 해시 필요,이 소금 오른쪽의 점은? 그럼 왜 우리가하지 않니?

bcrypt.compareSync("my password"+salt, hash); 
+0

소금의 주요 목표는 레인보우 테이블 공격, 즉 사전 계산 된 소금과 암호의 매핑을 방지하여 'originalPassword = rainbowTable [hash]'라는 크래킹의 복잡성을 줄이는 것입니다. 많은 소금이 더 좋지만 모든 시스템이 하나 이상의 소금을 사용하는 것은 아닙니다. – FakeRainBrigand

답변

2

salt은 라운드의 수는 너무 bcrypt.hash(Sync) 함수가 어떻게 얼마나 많은 라운드를 알고이 포함되어 있습니다. 따라서 hash은 간단한 해시가 아니며 salt이 포함 된 컨테이너입니다.

+1

좋습니다. 그렇다면 데이브에 소금 줄을 저장할 필요가 없다는 뜻입니까? hashSync ('pw', salt)의 반환 값을 저장하기 만하면됩니다. 소금이 포함되어 있기 때문에 salt를 명시 적으로 compareSync에 전달하지 않는 이유는 무엇입니까? – gloo

+0

그냥 '해시'저장 –

2

SALT은 2의 수 (4에서 31까지)입니다. - 해시를 만드는 함수의 반복 작업의 동그라미입니다. bcrypt 소금을 가지고 소금 시간을 2 곱하십시오. 그리고이 값을 사용하여 문자열 총합에 디코드 함수를 구현하십시오. 그것은 "둥근" 루프의 bcrypt 함수입니다. 당신이 할 때마다 :

bcrypt.hashSync("my password", salt) 

bcrypt마다 사용 같은 입력 문자열을 새로운 "무작위"문자열을 만들고 우리가 다른 출력 문자열을 같은 salt 사용, 그것은 작업 bcrypt의 핵심 아이디어 함수와이 총 결과를 기반으로 저장합니다. 그런 다음 우리는 사용 해시 문자열 "비밀번호"에서 만들어진 경우

bcrypt.compareSync("my password", hash); 

그리고 compareSync을 계산합니다. 그리고 우리가 함수 compareSync에 문자열 ("내 비밀번호")에 소금을 추가하면 시작된 문자열이 변경되며 은 이런 식으로true을 절대 사용하지 않습니다.그 생성 된 경우처럼 bcrypt이 방법을 hash을 비교합니다 때문에 : var salt = bcrypt.genSaltSync(10); var hash = bcrypt.hashSync("my password", salt);

  • 는 dB로 hash 저장 : 사용자 데이터를 생성하는 동안

    • 해시를 만듭니다

      bcrypt.hashSync("my password"+salt, salt); 
      

      우리는이 구조를 사용한다 방법이있다 그

    • 다음 단계 인증 사용자는 다음과 같습니다.

      어떤 salt 또는 매개 변수없이

    bcrypt.compareSync("my password", hash);

  • .