암호를 여러 번 해시하는 것이 더 안전합니까?


43

암호를 저장할 때 문자열을 '더블 해시'하는 것이 좋습니다 (예 : md5와 sha1, 모두 소금으로).

첫 번째 질문은 "이것이 실제로 맞습니까?"입니다. 그렇지 않은 경우이 질문의 나머지 부분을 닫으십시오. :)

내가 묻는 이유는 그 얼굴에 이것이 의미가 있다고 말하기 때문입니다. 그러나 내가 생각할 때 해시가 다시 해시 될 때마다 (아마도 무언가가 추가되었을 가능성이 있음) 최종 '고유성'에 대한 상한이 감소한다는 것입니다. 초기 입력

다시 말하면, 우리는 해시 될 때 y 개의 가능한 문자열로 줄어드는 x 개의 문자열을 가지고 있습니다. 즉, 첫 번째 세트에 충돌이 있습니다. 이제 두 번째 세트에서 세 번째 세트로 올 때 동일한 일이 발생할 수 없습니다 (예 : 세 번째 세트에서 동일한 해시를 초래하는 가능한 모든 'y'문자열 세트의 충돌)?

내 머리 속에, 내가 보는 모든 것은 각 해시 함수 호출에 대한 '퍼널', 유한 세트에 대한 무한한 가능성 세트를 '퍼널 링'하는 것입니다. 입력보다 크게 설정하지 마십시오.

어쩌면 예가 내 짓밟 음을 설명할까요? 'a'와 'b'에 해시 '1'을 제공하고 'c'와 'd'에 해시 '2'를 제공하는 'hash_function_a'를 사용하십시오. 비밀번호가 'a'인 경우에도이 기능을 사용하여 비밀번호를 저장하면 비밀번호 'b'를 사용할 수 있습니다.

'1'과 '2'에 해시 '3'을 제공하는 'hash_function_b'를 사용하십시오. I 사용한다면 이를 'hash_function_a'이후 '보조 해시'으로 다음 암호하더라도 'A'나 'B', 'C'또는 'D'를 사용할 수있다.

무엇보다도, 나는 소금을 사용해야한다는 것을 알지만, 우리가 'x'입력을 'x 미만'출력에 매핑 할 때마다 사실을 바꾸지는 않습니다. 나는 생각하지 않습니다.

누군가 내가 여기서 누락 된 것이 무엇인지 설명해 줄 수 있습니까?

감사!

편집 : 그만한 가치가 있기 때문에 나는 이것을 직접하지 않으며 bcrypt를 사용합니다. 그리고 나는 '해커'의 '사이클 사용'에 유용한 지 여부에 대해 걱정하지 않습니다. 프로세스가 해시 충돌 관점에서 '보안'을 감소시키는 지 궁금합니다.


2
@ S.Lott : 나는 그것이 실제 질문에 어떻게 대답하는지는 잘 모르겠습니다 ... "자신이하지 말고, 이것을 사용하십시오"또는 "시간을내는 것이 좋습니다!"입니다. .. 어느 쪽도 "실제로 더 안전하다"는 대답은 없습니다. 내가 빠진 것이 아니라면 다시 한 번.
수선화

@MetalMikester : 예, 그것은 어제의 기사였습니다 : thedailywtf.com/Articles/Bulletproof-Encryption.aspx
FrustratedWithFormsDesigner

이것은 IT 보안에 대한 주제는 아니지만 암호화와는 잘 어울립니다. 실제로, 그것은 이 질문 과 매우 유사하게 보입니다 .

나는 무염을 사용하려는 회사를 알고 있습니다 MD5(password). 우리는 그것이 안전하지 않다고 말했기 때문에 MD5(MD5(password))대신 사용을 제안 했습니다.
구성자

허용 된 답변이 정답이 아닙니다!
markus

답변:


27

이것은 security.stackexchange에 더 적합하지만 ...

문제

hash1(hash2(hash3(...hashn(pass+salt)+salt)+salt)...)+salt)

이것은 체인에서 가장 약한 해시 함수만큼 강력하다는 것입니다. 예를 들어 hashn (가장 안쪽 해시)이 충돌을 일으키는 경우 전체 해시 체인은 체인에 다른 해시가 무엇이든 관계없이 충돌을 일으 킵니다 .

더 강한 사슬은

hash1(hash2(hash3(...hashn(pass + salt) + pass + salt) + pass + salt)...) + pass + salt)

여기서 우리는 초기 충돌 문제를 피하고 본질적으로 최종 해시의 암호에 따라 소금을 생성합니다.

체인의 한 단계가 충돌하면 다음 단계에서 암호가 다시 사용되므로 다른 암호에 대해 다른 결과를 제공해야하므로 중요하지 않습니다.


따라서 현재 다음 해싱에 소금으로 '암호 + 소금'을 추가하면 깔때기에 들어갈 수있는 '재료'의 양이 증가 할 수 있습니다. 이제는 '얼마나 많은가'를 이해해야합니다. 감사.
수선화

실제로 나는 지금 그것을 얻는다고 생각한다. 해싱의 각 계층에 암호를 강제함으로써, 실제로 '충돌 암호'와 실제 암호가 각각의 '호출'에 걸쳐 일치하는 해시를 갖도록 요구함으로써 가능한 충돌 수를 실제로 감소 시키는가? , 권리? '각 레이어에 암호를 입력하십시오'부분이 누락되었다고 생각합니다! 다시 감사합니다.
수선화

또한 (만큼 외측 / 최종 해시 강한 같이) 내부 해시 바로 다음 패스 염 생성 될 때 약한 내부 해시 허용 보너스 갖는 아니 PROB @Narcissus하고 있음
래칫 괴물

흠, 나는 그 문제가 그것보다 조금 더 크다고 생각한다. 레인보우 공격을 사용하면 모든 해시를 고려하여 테이블을 생성 할 수 있으며 문제는 여전히 남아 있습니다.
woliveirajr

4
@Narcissus : 매우 짧은 대답으로 : 예, 안전 하지 않습니다 . 예, 아마도 안전 할 것입니다.
woliveirajr

54

다른 해싱 알고리즘을 사용하는 것은 나쁜 생각입니다. 엔트로피를 늘리기보다는 줄입니다.

그러나 암호화 적으로 강력한 해싱 알고리즘과 좋은 솔트가 있다고 가정하면 동일한 해시 함수를 여러 번 적용 하면 해싱 프로세스의 계산 비용이 높아집니다. 이것의 장점은 암호 해시를 크래킹하는 다른 방법이 실패하고 (추측, 사전 공격, 레인보우 테이블 등) 공격자가 무차별 대입 기술을 강요 당할 때 각 암호를 시도하는 데 시간이 더 걸리기 때문입니다. 동일한 해시 함수를 더 자주 적용해야합니다. 따라서 한 라운드의 해싱에 1 개월의 무차별 강제 적용이 필요한 경우 12 회 적용하면 예상 시간이 1 년으로 늘어납니다.

bcrypt와 같은 최신 해싱 알고리즘이이 아이디어를 기반으로합니다. 여기에는 해시의 계산 복잡도를 제어하는 ​​매개 변수가 포함되어 있으므로 하드웨어 속도가 진행됨에 따라 확장 할 수 있습니다. 하드웨어가 2 배 빨라지면 보상 할 복잡성이 증가하므로 무차별 대입에 필요한 시간 해시는 거의 일정하게 유지됩니다.


2
이것이 정답입니다!
markus

@ markus : 내가 읽은 토론에 따르면, 이것은 허용 된 답변으로 해결 된 "좋은 소금"이라는 추가 때문에 정확하지 않습니까? 이것이 왜 정확하고 허용되는 대답이 아닌가?
수선화

동일한 해싱 함수를 여러 번 적용 (파라미터 화 된)하는 유일한 이유는이 반복을 사용하여 더 빠른 하드웨어를 조정할 수 있기 때문에 정답입니다. 그렇지 않으면 여러 번 해싱하면 이점이 없습니다.
markus

@Narcissus 여기서 핵심은 엔트로피입니다. 같은 방법으로 여러 번 해싱하는 것과 다른 방법으로 여러 번 해싱하는 것에는 차이가 있습니다.
sakisk

3

암호 및 / 또는 보안 엔지니어링 과정을 기꺼이하지 않는 한 자신 만의 암호 해싱 체계를 작성하려고하지 마십시오.

PBKDF2, bcrypt, scrypt 또는 최신 Argon2와 같은 키 파생 함수 ( KDF )를 사용해야하는 잘 설정된 암호 해싱 구현을 사용해야합니다 .

좋은 KDF에는 오프라인 공격 비용을 높이기 위해 일반적으로 여러 반복 작업 요소가 포함됩니다. 이러한 KDF는 매번 동일한 알고리즘을 사용하여 암호를 여러 번 해시한다고 말할 수 있습니다. 다른 사람들이 지적한 것처럼 다중 메시지 다이제스트 알고리즘을 사용하는 데는 아무런 의미가 없습니다.


1
링크 https://crackstation.net/hashing-security.htm 은 방화벽에 의해 차단됩니다
gnat

1
@gnat 어떤 이유로 차단 된 URL에 대한 귀하의 의견을 놓쳤습니다. 나는 그것을 위키 백과에 대한 링크로 대체했다.
Erwan Legrand

2

일반적으로 둘 이상의 해싱 알고리즘을 사용할 필요가 없습니다.

당신이해야 할 일은 :

salt 사용 : salt는 비밀번호를 보다 안전하게 만들기 위해 사용되는 것이 아니라 무지개 테이블 공격을 차단하는 데 사용됩니다. 그렇게하면 누군가는 시스템에 저장 한 암호의 해시를 미리 계산하려고 노력하기가 더 어려워 질 것입니다.

여러 개의 interation을 사용하십시오 : SHA (password + salt)를 수행하는 대신 SHA (SHA (SHA (SHA (... ((SHA (암호 + salt))))))를 수행하십시오. 또는 다른 방법으로 표현하기 위해 :

hash = sha(password + salt)
for i=1 , i=5000, i++ {
    hash = sha(hash + salt);
}

마지막으로 좋은 해싱 기능을 선택하십시오. SHA, MD5 등은 너무 빠르기 때문에 좋지 않습니다 . 보호를 위해 해시를 사용하고자하므로 느린 해시를 사용하는 것이 좋습니다. 예를 들어 Bcrypt , PBKDF2 또는 Scrypt를 살펴보십시오 .

편집 : 관찰 후, 몇 가지 요점을 보도록합시다 (죄송합니다. 다른 사람이 비슷한 답변을 찾는 데 도움이 될 수 있기 때문에 끝까지 끝내기위한 긴 설명).

저장된 암호에 아무도 접근하지 못하는 것처럼 시스템이 안전하다면 해시가 필요하지 않습니다. 암호는 비밀이 될 것이며 아무도 그것을 얻지 못할 것입니다.

그러나 아무도 암호가있는 데이터베이스를 도난 당할 것이라고 확신 할 수 없습니다. 데이터베이스를 훔치고 모든 암호를 얻었습니다. 좋아, 당신의 시스템과 회사는 모든 결과를 겪을 것입니다. 따라서이 암호 유출을 피할 수 있습니다.

주의 사항 우리가이 시점에서 온라인 공격에 대한 걱정되지 않습니다. 한 번의 온라인 공격의 경우 가장 좋은 해결책은 잘못된 암호로 인해 속도를 늦추고 몇 번의 시도 후에 계정을 잠그는 것입니다. 따라서 암호를 암호화, 해시, 저장 등 어떤 방식 으로든 중요하지 않습니다. 온라인 공격은 암호 입력 속도늦추기 위한 것 입니다.

다시 don't let them take my plain passwords문제로 돌아갑니다 . 대답은 간단합니다. 일반 텍스트로 저장하지 마십시오. 알았어

그것을 피하는 방법?

비밀번호를 암호화하십시오 (?). 그러나 아시다시피, 암호화하면 적절한 키가 있으면 암호를 해독 할 수 있습니다. 그리고 당신은 키를 "숨길 곳"의 문제로 끝날 것입니다. 흠, 좋지 않다. 데이터베이스를 가지고 있기 때문에 키를 얻을 수있다. 좋아, 사용하지 말자.

또 다른 접근법 : 암호를 뒤집을 수없는 다른 것으로 변환하고 저장합시다. 제공된 비밀번호가 올바른지 확인하기 위해 동일한 프로세스를 다시 수행하고 두 개의 변형 된 값이 일치하는지 확인합니다. 일치하는 경우 = 올바른 비밀번호가 제공되었습니다.

좋아, 지금까지는 좋아 암호에 MD5 해시를 사용합시다. 그러나 ... 누군가 저장된 암호 값을 가지고 있다면 가능한 모든 암호 (부력)의 MD5 해시를 계산할 수있는 많은 컴퓨터 성능을 가질 수 있으므로 원래 암호를 찾을 수 있습니다. 또는 최악의 경우 모든 문자 조합에서 모든 MD5를 저장하고 쉽게 암호를 찾을 수 있습니다. 따라서 많은 시간이 걸리기 때문에 많은 반복 작업 인 HASH (HASH (HASH ()))를 수행하여 더 어렵게 만듭니다.

그러나 그조차도 우회 할 수 있지만 레인보우 테이블은 이러한 종류의 보호에 대비하여 정확하게 만들어졌습니다.

소금을 조금 바르겠습니다. 이러한 방식으로 각 상호 작용에서 소금이 다시 사용됩니다. 암호를 공격하려는 사람은 매번 소금이 첨가된다는 점을 고려하여 무지개 테이블을 생성해야합니다. 그리고 그가 그 무지개 테이블을 생성 할 때, 그것은 하나의 소금으로 생성 되었기 때문에, 다른 소금으로 다시 계산해야하므로, 각 암호에 대해 약간의 시간을 소비해야합니다 (= 각 소금). 솔트는 비밀번호에 "더 복잡한"기능을 추가하지 않으며, 공격자가 레인보우 테이블을 생성하는 데 시간을 허비 할뿐입니다. 각 비밀번호에 하나의 솔트를 사용하는 경우, 한 솔트의 테이블은 다른 비밀번호에 쓸모가 없습니다.

그리고 하나 이상의 해시를 사용하면 도움이 될 것입니까? 아니요. 특정 레인보우 공격을 생성하는 사람은 어쨌든 하나 이상의 해시를 사용하여 생성 할 수 있습니다.

그리고 둘 이상의 해시를 사용하면 하나의 문제가 발생할 수 있습니다. 사용하는 가장 약한 해시만큼 안전합니다. 누군가가 하나의 해시 알고리즘에서 충돌을 발견하면 반복 프로세스의 어느 시점에서든 암호를 해독하기 위해 악용되는 해시입니다. 따라서 더 많은 해시 알고리즘을 사용하여 아무것도 얻지 못하므로 좋은 알고리즘을 하나만 선택하는 것이 좋습니다. 사용하십시오. yuo가 고장났다는 소식을 들으면 응용 프로그램에서 어떻게 바꿀지 생각하십시오.

그리고 왜 bcrypt 또는 이와 유사한 것을 사용 하는가? 그렇기 때문에 MD5 + 대기 (3 초)를 사용해도 도움이되지 않습니다. 어쨌든 공격이 오프라인이되어 공격자가 (3 초 지연)없이 테이블을 생성 할 수 있습니다.


2
죄송합니다! 죄송합니다, (시간 초과 매개 변수를 통해 의도적으로 해시를 느리게 만드는 것에 대한) 의견은 진지하게 받아 들여지지 않았습니다 ... 최근에 너무 많은 Dilbert를 읽고 있다고 생각합니다.
FrustratedWithFormsDesigner

2
sha (sha (sha (...)))는 sha보다 안전하지 않습니다. sha 함수의 엔트로피가 최대가 아닌 경우 실제로 덜 안전합니다.
deadalnix

1
@ deadalnix : 원래 암호를 쉽게 복구 할 수는 없지만 충돌 암호를 생성하는 것이 더 쉽다는 것을 언급하는 것이 중요합니다.
Bryan Boettcher

1
@ deadalnix, Dale Gribble 의 목소리로 그 의견을 읽었습니다 .
jiggy

1
@deadalnix : sha (sha (sha ()))의 목표는 더 많은 엔트로피를 추가하는 것이 아니며 결코 그런 적이 없습니다. 엔트로피는 초기 사용자가 자신의 암호를 선택함으로써 이루어지며 다른 모든 것 (해시, 소금 등)은 무차별 대입 공격 속도를 늦추기 만합니다. 누군가가 암호를 포함하는 데이터베이스를 얻을 수 있다면 암호를 해시하는 데 사용되는 코드를 얻게 될 것입니다. 따라서 하드 코딩 된 소금도 알려져 있습니다
woliveirajr

-1

여러 해싱 알고리즘을 사용하는 것이 레인보우 테이블 을 물리 치는 것 입니다. 좋은 소금을 사용하는 것도 효과가 있지만 두 번째 수준의 보호라고 생각합니다.


4
글쎄, 이것은 그렇게 많이 변하지 않습니다. «다중 해시»기능은 하나로 간주되어 처리됩니다.
deadalnix

2
여러 해싱 기술이나 반복을 사용하면 레인보우 테이블을 물리 칠 수 없습니다. 공격자가 데이터베이스를 가지고 있고 해시를 생성하는 데 사용 된 방법이있는 경우 공격자는 레인보우 테이블을 생성하여 데이터베이스의 모든 암호를 공격 할 수 있습니다. SALTS는 레인보우 테이블 공격을 방지하여 공격자가 단일 조회 사전을 생성하여 모든 문자를 8 자 이하로 공격 할 수 없도록합니다.
Erik Erik

-1

이것은 더 안전하지 않습니다. 그러나 동일한 기능을 가진 해시를 기반으로 한 식별 프로토콜이 있습니다.

이것은 그렇게 간다. 저장된 값은 컴퓨터 A의 hash ^ n (pass)입니다. A는 B에게 인증을 요청하고 B에게 정수 n을 제공합니다. B는 계산 해시 ^ (n-1) (통과)를 수행하여 A로 다시 보냅니다.

hash (hash ^ (n-1) (pass)) == hash ^ n (pass) 확인하십시오. 그것이 사실이라면, 인증이 완료된 것입니다. 그러나 A 상점 해시 ^ (n-1) (pass) 및 다음 인증은 n 대신 B n-1을 제공합니다.

이를 통해 암호가 명확하게 교환되지 않도록하고 A가 암호를 모르고 인증이 재생에 의해 보호되도록합니다. 그러나 이것은 유한 수명의 암호를 요구하는 단점이 있습니다. n이 값 2에 도달하면 인증 후 새 비밀번호를 선택해야합니다.

다중 해시의 또 다른 사용은 요청의 인증 및 무결성을 보장하는 도구 HMAC입니다. HMAC에 대한 자세한 내용은 http://en.wikipedia.org/wiki/HMAC를 참조하십시오 .

실제 세계에서 다중 해시 사용은 대부분 과잉입니다. 귀하의 경우에는 같습니다. 여러 해시 함수를 사용하는 경우 모두 동일한 엔트로피를 갖지 않으므로 해시의 강도가 줄어 듭니다. 예를 들어, md5는 sha1보다 엔트로피가 적으므로 md5에서 sha1을 사용하면 해시 강도가 향상되지 않습니다. 강도는 일반적으로 약한 해시 함수의 강도와 같습니다.

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