사용자 비밀번호 솔트의 최적 길이는 얼마입니까? [닫은]


128

모든 소금 은 사용자의 암호를 소금에 절이고 해시 할 때 분명히 도움이됩니다. 소금이 얼마나 오래 지속되어야하는지에 대한 모범 사례가 있습니까? 사용자 테이블에 솔트를 저장하므로 스토리지 크기와 보안 사이의 최상의 균형을 원합니다. 임의의 10 문자 소금이면 충분합니까? 아니면 더 긴 것이 필요합니까?


10
소금의 길이에 대한 권장 사항은 없지만 여기에 표시되는 답변에는 많은 나쁜 정보가 있습니다. 당신의 소금은 반드시 :-무작위-비밀 (프로그램 이미지 나 구성 파일에 저장된 단일 값이 아님)입니다. 소금은 암호화 비밀이 아니므로 테이블에 저장해도 문제가 없습니다. 솔트의 유일한 목적은 동일한 항목의 서로 다른 인스턴스가 해시 (또는 암호화) 될 때 다른 결과를 얻도록하는 것입니다.
Michael Burr

2
어떤 소금을 모르는 사람들을 위해입니다 : <a href=" en.wikipedia.org/wiki/Salt_(cryptography)"> 소금 위키 백과 (암호화) </a>에
데이비드 Koelle

1
또는 소금 길이와 해시 출력 길이에 대한 최적의 비율이 있다면? 8 바이트 솔트는 HMAC-SHA-256에는 충분하지만 HMAC-SHA-512에는 충분하지 않을 수 있습니다.
Crend King

1
해시 함수의 출력과 동일한 크기의 암호로 무작위 소금은 "모든 가능한 소금을 시도하십시오"(비밀번호 사전 포함) 공격에는 "가능한 모든 해시 결과를 시도하십시오"공격만큼 많은 노력이 필요합니다. . 소금이 짧을수록 소금 사전과 암호 사전을 무차별 대입 공격으로 사용할 수 있습니다.
Richard Gadsden

-1 당연히 질문에 대답하지 않습니다.
user359996

답변:


70

이러한 답변의 대부분은 약간 잘못 안내되어 소금과 암호화 키 사이의 혼란을 보여줍니다. 솔트를 포함하는 목적은 저장된 각 비밀번호 해시가 개별적으로 공격되도록 각 사용자의 비밀번호를 해시하는 데 사용되는 기능을 수정하는 것입니다. 유일한 보안 요구 사항은 사용자마다 고유해야하며 예측할 수 없거나 추측하기 어려운 이점이 없습니다.

소금은 각 사용자의 소금이 독특 할 정도로 길어야합니다. 임의의 64 비트 솔트는 10 억 명의 등록 된 사용자라도 반복 될 가능성이 거의 없으므로 괜찮습니다. 단일 반복 솔트는 비교적 작은 보안 문제이므로 공격자가 두 계정을 한 번에 검색 할 수 있지만 전체 데이터베이스에서 검색 속도를 크게 향상 시키지는 않습니다. 32 비트 솔트조차도 대부분의 경우 허용되지만 최악의 경우 공격자의 검색 속도가 약 58 % 빨라집니다. 64 비트 이상으로 염분을 증가시키는 비용은 높지 않지만 그렇게 할 보안 이유는 없습니다.

사용자 별 솔트 위에 사이트 전체 솔트를 사용하면 다른 이점이 있습니다. 이렇게하면 다른 사이트에 저장된 비밀번호 해시와의 충돌을 막을 수 있고 32 비트의 비트조차도 일반 레인보우 테이블을 사용할 수 없습니다 소금은 무지개 테이블을 비현실적인 공격으로 만들기에 충분합니다.

더 단순하고 개발자조차도 항상 이것을 간과합니다. 고유 한 사용자 ID 또는 로그인 이름이 있으면 소금으로 완벽하게 작동합니다. 이 작업을 수행하는 경우 동일한 아이디어를 가진 다른 시스템 사용자와 겹치지 않도록 사이트 전체 소금을 추가해야합니다.


16
소금을 예측할 수 없다는 이점이 있습니다. 예측 가능한 솔트가 예측되어 해시 테이블 공격에 사용될 수 있습니다. 예를 들어, 소금이 사용자 아이디 인 경우 충분히 긴 일반 알파 해시 테이블에는 모든 비밀번호뿐만 아니라 모든 사용자 이름 + 비밀번호 조합이 포함됩니다.
Richard Gadsden

6
사이트 전체 소금을 사용하는 경우 마지막 단락과 관련하여 사이트 전체와 정확히 일치해야합니다. 응용 프로그램 전체가 아닙니다. 즉, 응용 프로그램을 설치하는 각각의 새 인스턴스는 사이트 전체에 새로운 소금을 생성해야합니다. 예를 들어, Windows가 모든 Windows 인증 데이터베이스에서 동일한 솔트를 사용한 경우 해당 솔트에 대한 레인보우 테이블을 작성하는 것이 좋습니다. 그러나 모든 Windows 설치에서 새 솔트가 생성되면 그렇지 않습니다.
Richard Gadsden

5
문제는 실제로 소금을 추측하기가 어렵다는 것이 아닙니다. 공격자는 소금을 추측 할 필요가 없습니다. 해시에 액세스 할 수있는 사람은 이미 소금을 가지고 있습니다. 문제는 소금이 사용자 이름과 같이 매우 일반적인 경우 다른 사이트의 소금과 동일 할 수 있으며, 그 시점에서 공격자가 가능한 작은 무지개 테이블 세트가 필요하다는 것입니다. 이것이 다른 사이트와 이런 종류의 충돌을 피하기 위해 사이트 별 소금 아이디어가 언급 된 이유입니다.
Nate CK

3
빠른 참고 : 사용자 이름을 소금으로 사용하는 경우 사용자 이름이 변경되면 문제가 될 수 있습니다. 실제로 (고객의 디자인 문서에 언급 된 내용에도 불구하고) 사용자가 종종 사용자 이름을 변경하려고한다는 것을 알았습니다.
SilentSteel

5
@ NateC-K, 당신이 말하는 사이트 당 소금 아이디어는 후추라고 불립니다.
Pacerier

35

현재 해싱 암호에 대해 허용되는 표준 은 모든 암호에 대해 새로운 16 자 길이의 새 소금을 만들고 암호 해시와 함께 소금을 저장합니다.

물론 무작위로 소금을 만들려면 적절한 암호 관리가 필요합니다.


6
문자 가 약간 잘못 정의되어 있습니다. byte 라고해야합니다 .
코드 InChaos

10
@CodesInChaos 나는 당신이 옥텟 을 의미한다고 생각합니다 ;-)
user2864740

1
안녕하세요! Wikipedia 기사가 변경된 것 같습니다. en.wikipedia.org/wiki/PBKDF2 또는 다른 것을 참조해야 합니까?
Boris Treukhov


24

편집 : 내 아래 답변은 요청에 따라 질문에 대답하지만 "실제"답변은 bcrypt , scrypt 또는 Argon2 만 사용 하십시오 . 이와 같은 질문을한다면 너무 낮은 수준의 도구를 사용하는 것입니다.

솔직히 말해서 소금이 해시 암호와 동일한 길이를 갖지 않아야하는 확실한 이유는 없습니다. SHA-256을 사용하는 경우 256 비트 해시가 있습니다. 256 비트 솔트를 사용하지 않는 이유는 없습니다.

256 비트 이상은 수학적으로 보안을 향상시키지 않습니다. 그러나 더 짧은 소금을 섭취하면 무지개 테이블이 소금 길이를 따라 잡는 상황, 특히 소금이 짧은 경우가 있습니다.


10
그건 아니에요 큰 거래; 사용자는 밀리 초 해시와 0.5 초 해시의 차이를 거의 인식하지 못하지만 암호 해싱은 실제로 무차별 대입 공격의 속도를 늦추기 위해 더 오랜 시간 걸리지 만 15 분 동안 잠긴 전형적인 3 회의 공격이 더 낫습니다. 이것을하기 위해 CPU 사이클을 낭비하고 있습니까? 아 뭐 어쨌든. 어쨌든 CPU는 대부분의 웹 사이트가 아닌 것보다 유휴 시간이 더 오래 걸리므로 중요한 것은 무엇입니까? 성능 문제가 발생하면 수평 확장하십시오.
Randolpho

14
소금은 무지개 테이블을 방어합니다. 256 비트 해시가 포함 된 512 비트 솔트는 여전히 최종 비밀번호에서 256 비트의 엔트로피 만 발생합니다.
Stephen Touset

8
느린 해싱 은 버그가 아닌 기능입니다.
outis

7
3 비트 해시가있는 경우 9999 비트 솔트는 여전히 3 개의 가능한 엔트로피 비트까지만 해시합니다. 레인보우 테이블은 각 암호에 대해 세 개의 소금 만 찾아야 만 다른 출력을 얻을 수 있으며, 이는 지속적인 곱셈 요소이므로 big-O에서 삭제됩니다.
Stephen Touset

2
.................................................. .................................... 특정 시스템. 솔트목적은 사전 계산 공격을 중지하여 해시를 검색하여 즉시 일반 텍스트로 되돌릴 수 없도록하는 것 입니다. 9999 비트 솔트를 사용하면 비밀번호가 비밀로 유지되는 반면 3 비트 솔트를 사용하면 비밀번호가 전 세계에 알려지게됩니다 (많은 사람들이 종종 비밀번호를 재사용하므로 비밀번호를 사용하여 다른 계정에 로그인 할 수 있음). 나는 여기에 5 명의 사람들이 "엔트로피"라는 단어로 인해 당신의 의견을 실제로지지 한 것이 재미 있다는 것을 알게되었습니다.
Pacerier

7

위키 백과 :

Linux, BSD Unixes 및 Solaris에서 사용되는 SHA2-crypt 및 bcrypt 메소드에는 128 비트의 소금이 있습니다. 이러한 더 큰 솔트 값은 가까운 시일 내에 이러한 시스템에 대해 거의 모든 길이의 암호에 대한 사전 계산 공격을 불가능하게합니다.

128 비트 (16 바이트) 솔트이면 충분합니다. 128 / 4 = 3216 진수 로 표시 할 수 있습니다 .


다른 보안 시스템이 사용하는 예는 모범 사례가 무엇인지를 보여주는 훌륭한 예인 것 같습니다.
cjbarth

1
@ mklement0 감사합니다. 답변을 업데이트했습니다.
Andrii Nemchenko

2

하나의 해답은 사용하려는 해시가 보안 측면에서 제공하는 가치를 소금의 크기로 사용하는 것입니다.

예를 들어 SHA-512를 사용하려는 경우 SHA-512에서 제공하는 보안이 256 비트이므로 256 비트 솔트를 사용하십시오.

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