비밀번호 소금에 절인 : 모범 사례?


162

나는 항상 궁금해했다 ... 해싱 암호를 소금에 절일 때 더 나은 것이 무엇입니까? 왜? 아니면 소금을 바르는 한 그것은 중요합니까?

설명하기 : 우리는 모든 (희망) 이제 우리가해야으로 알고 소금 [우리가 데이터베이스에 저장을 위해 해시하기 전에 암호를 편집 : 당신이 좋아하는 일을 피할 수 있도록 최근 제프 앳 우드에게 무슨 일이 일어 났는지 ]. 일반적으로 이것은 해싱 알고리즘을 통과하기 전에 소금과 암호를 연결하여 수행됩니다. 그러나 예는 다양합니다 ... 일부 예는 암호 앞에 소금을 추가합니다. 일부 예 는 암호 뒤에 소금 추가 합니다. 나는 소금을 중간에 넣는 것을 보았습니다.

그렇다면 어느 쪽이 더 나은 방법이며 왜 그렇습니까? 해시 충돌 가능성을 줄이는 방법이 있습니까? 내 인터넷 검색에서 주제에 대한 적절한 분석을 설정하지 않았습니다.

편집 : 좋은 답변 사람들! 답변을 하나만 선택할 수있어서 죄송합니다. :)



1
@Jaccco : 멋진 입력. 감사!
Randolpho

3
가장 좋은 방법은 PBKDF2 (표준), bcrypt 또는 scrypt를 사용하여 솔트를 수행하는 암호화 기능을 사용하는 것입니다. 지적한 Stephen에게 감사합니다.
Maarten Bodewes

1
거의 모든 표준 비밀번호 해싱 구조는 솔트와 비밀번호의 결합을 처리하므로 걱정할 필요가 없습니다. 표준 비밀번호 해시를 사용하지 않는 경우 표준 비밀번호 해시로 마이그레이션하십시오.
코드 InChaos

1
@Omu 나쁜 추천. 1) SHA-1의 단일 반복이 너무 빠르므로 적어도 10000을 사용해야하며 심지어 약합니다. 2) 기본 소금이 너무 작습니다. 최소 8 바이트이며 16을 권장합니다.
코드 InChaos

답변:


111

접두사 또는 접미사는 관련이 없으며 암호에 엔트로피와 길이를 추가하는 것입니다.

이 세 가지를 고려해야합니다.

  1. 소금은 저장하는 모든 비밀번호마다 달라야합니다. (이것은 일반적인 오해입니다.)
  2. 암호로 안전한 난수 생성기를 사용하십시오.
  3. 충분히 긴 소금을 선택하십시오. 생일 문제에 대해 생각하십시오.

Dave Sherohman 은 사용자 이름 (또는 다른 개인 데이터) 대신 무작위로 생성 된 소금을 사용해야하는 또 다른 질문 대한 훌륭한 답변 을 제공합니다. 이러한 제안을 따르면 소금을 어디에 넣든 상관 없습니다.


4
이전 질문에 대한 링크를 추가했습니다. 해당 답변을 읽으십시오. 기본적으로 암호마다 다른 임의의 소금을 사용하지 않으면 불필요한 보안 위험을 감수 할 수 있습니다. 이는 미래에 실제로 문제가 될 수 있습니다.
Georg Schölly 2016 년

39
공격자가 레인보우 테이블을 미리 계산하고 전체 사용자 데이터베이스를 확보 할 수 있기 때문에 사이트 전체의 임의 소금이 나쁩니다. 당신이 이것을 이해하지 못하면, 로그인 / 보안 시스템을 작성하지 마십시오 :)-당신은 사용자 당 소금이 필요합니다.
snemarch

3
예, 사용자 당 소금. 이상적으로는 사용자 별 반복이 저장되므로 시간이 지남에 따라 반복 횟수를 늘릴 수 있습니다. 괜찮은 프레임 워크에는이 기본 제공 기능이 있습니다. (.NET에는 PasswordDeriveBytes가있어 모든 것을 처리 할 수 ​​있습니다.)
MichaelGG

2
모든 종류의 보안 시스템을 설계하는 경우 사용자 별 소금을 사용하지 않는 것이 좋습니다. 귀하의 사이트가 흥미롭지는 않지만 여러 사이트에서 동일한 비밀번호를 사용하는 사용자를 고려하십시오 ... 데이터베이스를 안전하게 유지하려는 시도는 실패하는 경향이 있습니다 :)
snemarch

2
물론 소금은 사전 공격을 훨씬 느리게하여 사전 공격으로부터 보호합니다. 암호에 소금을 사용하면 무지개 테이블보다 훨씬 오래갑니다. 솔트는 공격자가 암호를 한 번 해시 한 후 모든 사용자와 비교하여 사전 공격 속도를 늦추기 위해 특별히 추가되었습니다.
Glenn Maynard

27

나는 그것이 의미론이라고 생각합니다. 매우 구체적인 위협 모델을 제외하고 전후에 넣는 것은 중요하지 않습니다.

그것이 있다는 사실은 무지개 테이블을 물리 칠 것이라고 생각됩니다.

필자가 주장한 위협 모델은 공격자 암호에 추가 / 미리 추가 된 일반 소금의 레인보우 테이블을 가질 수있는 시나리오라고 주장했다 . (NSA에게 말하십시오) 당신은 그들이 추가하거나 앞에 붙은 것으로 추측하지만 둘다는 아닙니다. 어리석은 추측이다.

레인보우 테이블을 저장할 수 있지만 암호 중간에 이상한 소금이있는 테이블은 저장할 수 없다고 가정하는 것이 좋습니다. 에서 좁은 경우, 나는 최선을 다 할 것 산재 것을 추측한다.

내가 말했듯이 의미론입니다. 비밀번호마다 다른 소금, 긴 소금을 선택하고 기호 및 ASCII 코드와 같이 이상한 문자를 포함하십시오. © ¤¡


@onebyone, 젠장! 그는 '비밀 소금'의 소금을 발견했습니다!
Samuel

6
@Samuel : 나는 당신에 대해 모른다, 그러나 우리는 소금에 '12345'를 사용합니다. :)
Randolpho

@onebyone 유효합니다. 나는 "공통"을 "문자 수 Y에서 길이 X 미만의 모든 염"으로 의미했는데, 여기서 X, Y는 합리적입니다. 20 자, 영숫자 대문자 / 소문자를 말합니다. 해시 된 해시의 레인보우 테이블이 유용 할 것으로 생각되기 때문에 길이 Z (160)에 해당하는 모든 16 진 문자열을 말할 수 있습니다.
Tom Ritter

1
@Randolpho : 이봐, 나도 내 소금이야! 승산은 무엇입니까?
Adrien

소금이 예측할 수없는 / 무작위인지 확인하십시오 : stackoverflow.com/questions/1645161/…
Jacco

18

아무도 손대지 않은 것처럼 보이는 실제 답변은 둘 다 잘못되었다는 것 입니다. 당신이 당신의 자신의 암호화를 구현하는 경우, 아무리 사소한 부분 당신은 당신이, 당신이하고있는 생각하지 가는 실수를 할 수 있습니다.

HMAC 가 더 나은 접근 방법이지만 SHA-1과 같은 것을 사용하는 경우에도 속도 설계로 인해 비밀번호 해싱에 적합하지 않은 알고리즘을 이미 선택했습니다. bcrypt 또는 아마도 scrypt 와 같은 것을 사용하고 손에서 문제를 완전히 제거하십시오.

아, 그리고 결과 해시를 프로그래밍 언어 또는 데이터베이스 문자열 비교 유틸리티와 동등하게 비교하는 것에 대해 생각조차하지 않습니다. false문자가 다른 것처럼 문자와 단락을 비교합니다 . 따라서 공격자는 통계적 방법을 사용하여 한 번에 한 문자 씩 해시가 무엇인지 시도하고 해결할 수 있습니다.


1
마지막 단락과 관련하여 : 공격자는 비교에 실패한 정확한 문자 수에 대한 정보를 어떻게 얻을 수 있습니까? 이것은 말이되지 않습니다 ..
halloweenlv

1
당신은 정확하고 틀립니다. 타이밍 공격 은 실제적이며, 비교 지연이 발생한 위치를 정확하게 판단하기 위해 가변 레이턴시 네트워크 연결에서도 끔찍한 정확도로 실행 가능한 것으로 반복적으로 입증되었습니다. 그러나 타이밍 공격은 실제 비밀번호 해시에는 실제로 적용 할 수 없습니다. 출력의 작은 부분 만 변경하는 입력을 찾는 것은 계산할 수 없기 때문입니다.
Stephen Touset

9

차이가 없어야합니다. 소금을 넣을 때마다 해시는 더 이상 쉽게 추측 할 수 없습니다. 의도적으로 비선형이기 때문에 해시 충돌은 드물고 예측할 수 없습니다. 보안에 차이가 있다면, 이는 소금이 아닌 해싱에 문제가 있음을 시사합니다.


1
해시 충돌은 해시 크기에 따라 다릅니다. 생일 문제로 인해 충돌이 발생할 가능성이 큽니다.
Georg Schölly

2
결과를자를 경우에만. 어쨌든, 나는 여전히 소금과 소금의 차이를 만들지 않을 것입니다. 해시의 점은 입력과 출력 사이의 관계에 패턴을 포함시키지 않기 때문입니다.
필 H

7

암호로 안전한 해시를 사용하는 경우 접두사 또는 접미사 여부는 중요하지 않습니다. 해싱의 요점은 소스 데이터의 단일 비트 변경 (어디에 상관없이)이 다른 해시를 생성해야한다는 것입니다.

무엇 이고 중요하지만, 적절한 암호 PRNG로 발생, 장기 염을 사용하고, 사용자 별 염을 구비한다. 데이터베이스에서 사용자 별 염을 저장하는 것은 없는 사이트 전체 해시 사용, 보안 문제 입니다 .


2
잘못된 답변 : 공격자는 스트리밍을 지원하기 위해 메시지 다이제스트가 증분 방식으로 작동하기 때문에 자주 사용되는 많은 암호에 대해 MD (통과)를 미리 계산 한 다음 MD (통과 + 소금)를 매우 저렴하게 계산할 수 있습니다.
Erwan Legrand

5

우선, "무지개 테이블"이라는 용어는 일관되게 오용됩니다. "무지개"테이블은 특정 종류 의 조회 테이블이며 키에서 특정 종류의 데이터 압축을 허용합니다. 공간에 대한 계산을 교환함으로써 1000TB를 차지하는 룩업 테이블을 수천 번 압축하여 더 작은 드라이브 드라이브에 저장할 수 있습니다.

비밀번호 조회 테이블, 무지개 등의 해시에 대해 걱정해야합니다.

@ onebyone.livejournal.com :

공격자는 사전 단어의 해시가 아니라 해시 계산을 마치기 직전에 해시 계산 상태로 구성된 '무지개 테이블'을 가지고 있습니다.

그런 다음 접두사 salt보다 postfix salt를 사용하여 암호 파일 항목을 무차별 처리하는 것이 더 저렴할 수 있습니다. 각 사전 단어마다 차례로 상태를로드하고 salt 바이트를 해시에 추가 한 다음 마무리합니다. 접두사로 소금을 사용하면 각 사전 단어의 계산 사이에 공통점이 없습니다.

간단한 선형 합동 생성기와 같은 입력 문자열을 통해 선형으로 스캔하는 간단한 해시 함수의 경우 실제 공격입니다. 그러나 암호로 안전한 해시 함수는 의도적으로 여러 라운드를 갖도록 설계되었으며 각 라운드는 입력 문자열의 모든 비트를 사용하므로 솔트를 추가 하기 직전에 내부 상태를 계산하는 것은 첫 번째 라운드 이후에는 의미가 없습니다. 예를 들어 SHA-1에는 80 라운드가 있습니다.

또한 PBKDF와 같은 암호 해싱 알고리즘은 해시 함수를 여러 번 작성합니다 (PBKDF-2를 최소 1000 회 반복하고 각 반복은 SHA-1을 두 번 적용하는 것이 좋습니다).이 공격은 이중 비실용적입니다.


라운드 설명을 다시 확인해야합니다. 라운드는 전체 메시지가 아닌 청크로 구성됩니다. (그렇지 않으면 스트리밍 데이터를 해싱하려면 되감기를 반복해야합니다.) 반복을 사용하면 언급 한 문제를 방지 할 수 있습니다.
MichaelGG

4

플랫폼에 제공자가있는 경우 BCrypt 해시 . 나는 당신이 소금을 만드는 것에 대해 걱정하지 않는 방법을 좋아하며 원하는 경우 더 강하게 만들 수 있습니다.


3
내가 아는 것처럼 BCrypt Hash는 다른 해싱 구성표와 마찬가지로 솔트가 필요합니다.
Jacco

2

소금에 임의의 수의 문자를 암호에 삽입하는 것이 가장 예상되는 경우가 아니므로 사회적으로 가장 "안전한"암호이지만 길고 고유 한 암호를 사용하는 한 일반적인 경우에는 그다지 중요하지 않습니다. 소금을위한 끈.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.