2014-09-18 6 views
3

나는 Coda Hale의 Ruby bcrypt library을 사용하고 있습니다. 나는 그것이 효과가 있다고 생각했던 것처럼 작동하지 않는다는 것을 최근에 알아 차렸다. 나는 적절한 절차이라고 생각했다 :Ruby의 bcrypt lib가 해시의 일반 텍스트로 소금을 포함하는 이유는 무엇입니까?

  1. 이 확보 암호
  2. 연결하여 소금과 해시 기능을 통해
  3. 그들을 해시 암호 문자열을 소금
  4. 를 생성

그러나 내가 bcrypt 함수의 결과를 볼 때 소금이 해시이 아니라 암호에 연결되어있는 것처럼 보입니다.. 소금 결합은 이전이 아닌 4 단계 이후에 일어납니다. 나는 코다 헤일이이 일을한다고 가정하고 있지만, 왜 이런 행동을하는지 궁금합니다.

다음은 간략한 IRB 세션으로 나에게 이상한 것을 보여줍니다. hash_secret 함수의 결과에서 첫 번째 29 개의 문자는 이고 소금은과 같습니다. 이것이 왜 그런지에 대한 정보는 인정 될 것입니다.

나의 유일한 이론은 salt가 별도의 DB 필드 (본질적으로 레코드 패킹 전략)에 저장할 필요가 없도록 해시에 과이 포함되어 있다는 것입니다.

irb#1(main):004:0> password_salt = BCrypt::Engine.generate_salt 
=> "$2a$10$OrKdcWORLL8Gorhy9XR3UO" 
irb#1(main):005:0> password='abc' 
=> "abc" 
irb#1(main):006:0> BCrypt::Engine.hash_secret(password, password_salt) 
=> "$2a$10$OrKdcWORLL8Gorhy9XR3UOY8Sebzq92m7r02XPitzoazPdO7tmsEO" 
irb#1(main):007:0> 
+2

소금을 해시와 별도로 저장할 필요가 없도록 만듭니다. 소금은 암호와 연결되어 해시를 생성하지만 소금은 해시를 테스트하는 데 단일 문자열 만 필요하도록 해시에 추가로 연결됩니다 (해시 알고리즘에 대한 다른 메타 데이터와 함께). –

+1

또한 [bcrypt에는 내장 소금이 있습니까?] (http://stackoverflow.com/questions/6832445/how-can-bcrypt-have-built-in-salts/6833165#6833165), 아마도 더 좋을 것입니다. 의지. –

+0

@MichaelBerkowski - agree -이 질문을하기 전에 두 번째 질문 (검색을 했어!)을 보았 으면합니다. 내 특정 질문에 대답 이후 중복으로 표시하도록 투표했습니다. –

답변

3

기술적 인 이유가 없습니다. 원한다면 소금과 암호를 따로 저장할 수 있습니다. 혹시 원한다면 소금을 공개 할 수 있습니다. 나는 사람들이 자신의 데이터베이스에 몇 비트의 저장 공간을 저장하기 위해 소금으로 user-id를 사용할 것이라고 들었다.

같은 데이터베이스의 다른 필드에 해시와 소금을 저장하면 보안 효과가 없습니다. 정말 중요한 것은 무지개 표를 막기 위해 각 소금이 독특하다는 것입니다.

작성자가 데이터베이스와 응용 프로그램의 단일 필드에서 소금과 해시를 함께 유지하기 위해 두 문자열을 연결하기로 결정했다고 상상합니다. 때로는 다중 값 반환을 지원하지 않는 언어와 같이 유용 할 수 있습니다.

+2

또한 해시 된 암호를 저장하기위한 단일 필드가있는 UNIX 형식 시스템에서 암호를 저장하는 방법이기도합니다. 문자열에는 해싱 방법, 소금 및 해시에 대한 정보가 상당히 표준 형식으로 나와 있습니다. 그렇게하면 나중에 해싱 방법을 변경하면 이전 해시 된 암호가 계속 작동합니다. 소금과 해싱 방법이 알려져 있지 않으면 해시를 재현 할 수 없다는 점은 주목할 가치가 있습니다. – tadman