일반적으로 둘 이상의 해싱 알고리즘을 사용할 필요가 없습니다.
당신이해야 할 일은 :
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 초 지연)없이 테이블을 생성 할 수 있습니다.