데이터베이스에 비밀번호를 해시하려면 어떤 알고리즘을 사용해야 합니까?[복제하다]

StackOverflow https://stackoverflow.com/questions/116684

문제

이 질문에는 이미 답변이 있습니다.

거기에 있습니까? 아무것 사소하게 깨지지 않는 것이 가능합니까?

도움이 되었습니까?

해결책

이 2008년 답변은 이제 위험할 정도로 오래된 것입니다. SHA(모든 변종)는 이제 쉽게 깨질 수 있으며, 모범 사례는 이제(2013년 1월 현재) 키 확장 해시(예: PBKDF2) 또는 이상적으로는 RAM 집약적 해시(예: 비크립트) 그리고 사용자별 소금도 추가합니다.

2, 3, 4번 항목은 여전히 ​​주목할 가치가 있습니다.

참조 IT 보안 SE 사이트 이상.


2008년 원래 답변:

  1. 검증된 알고리즘을 사용하세요.SHA-256은 데이터베이스에서 64자를 사용하지만 열의 인덱스는 문제가 되지 않으며 검증된 해시이며 MD5 및 SHA-1보다 더 안정적입니다.또한 표준 보안 제품군의 일부로 대부분의 언어로 구현됩니다.그러나 SHA-1을 사용하면 기분 나빠하지 마십시오.

  2. 비밀번호만 해시하지 말고 다른 정보도 입력하세요.단순히 비밀번호보다는 "username:password:salt" 또는 이와 유사한 해시를 사용하는 경우가 많지만, 이를 사용하면 사전 공격을 실행하기가 더욱 어려워집니다.

  3. 보안은 어려운 분야입니다. 자신만의 알고리즘과 프로토콜을 만들 수 있다고 생각하지 마십시오.

  4. "[AddUser] Hash of GeorgeBush:Rep4Lyfe:ASOIJNTY is xyz"와 같은 로그를 작성하지 마세요.

다른 팁

암호화 및 비밀번호 저장의 첫 번째 규칙은 "스스로 발명하지 마세요," 그러나 보안을 유지하기 위해 수행해야 하는 최소한의 조치는 다음과 같습니다.

기본 규칙:

  1. 일반 텍스트 비밀번호를 저장하지 마십시오. 즉, 비밀번호를 표시하거나 전송할 수 없습니다.
  2. 보안되지 않은 라인(일반 텍스트, 인코딩 또는 해시)을 통해 저장된 비밀번호 표현을 전송하지 마십시오.
  3. 속도는 당신의 적입니다.
  4. 정기적으로 재분석하고 프로세스를 개선하세요 하드웨어 및 암호 분석이 향상됨에 따라.
  5. 암호화 및 프로세스는 매우 작은 솔루션의 일부.
  6. 실패 지점은 다음과 같습니다.저장, 클라이언트, 전송, 처리, 사용자, 법적 영장, 침입 및 관리자.

단계:

  1. 합리적인 최소 비밀번호 요구사항을 시행하세요.
  2. 비밀번호를 자주 변경하세요.
  3. 얻을 수 있는 가장 강력한 해시를 사용하세요. SHA-256 여기에 제안되었습니다.
  4. 비밀번호를 다음과 결합하세요. 고정된 소금 (전체 데이터베이스에 대해 동일).
  5. 이전 단계의 결과를 다음과 결합합니다. 독특한 소금 (아마도 사용자 이름, 레코드 ID, GUID, 긴 난수 등)가 이 레코드에 저장되고 첨부됩니다.
  6. 해시 알고리즘을 여러 번 실행 - 1000번 이상.이상적으로는 이전 해시에 매번 다른 소금을 포함합니다.속도는 적이며 여러 번 반복하면 속도가 감소합니다.매번 반복이 두 배로 증가합니다(이를 위해서는 새 해시를 캡처해야 합니다. 다음에 비밀번호를 변경할 때 수행하십시오.)

아, 그리고 SSL이나 다른 라인 보안을 실행하지 않는 한 비밀번호가 일반 텍스트로 전송되는 것을 허용하지 마세요.그리고 클라이언트의 최종 해시만 저장된 해시와 비교하는 경우에도 일반 텍스트로 전송되는 것을 허용하지 마세요.nonce(한 번 사용된 숫자)를 클라이언트에 보내고 생성된 해시(위 단계 사용)로 해시하도록 한 다음 해당 해시를 보내야 합니다.서버 측에서는 동일한 프로세스를 실행하고 두 개의 일회성 해시가 일치하는지 확인합니다.그런 다음 폐기하십시오.더 좋은 방법이 있지만 이것이 가장 간단한 방법입니다.

CodingHorror는 작년에 이에 대한 훌륭한 기사를 게재했습니다.

http://www.codinghorror.com/blog/archives/000953.html

기사 마지막 부분의 권장 사항은 BCrypt입니다.

앞서 언급한 알고리즘은 암호학적으로 안전한 해싱 알고리즘입니다(그러나 MD5는 현재 안전한 것으로 간주되지 않습니다).

그러나 비밀번호에서 키를 파생시키기 위해 특별히 만들어진 알고리즘이 있습니다.이들은 주요 파생 함수.대칭 암호와 함께 사용하도록 설계되었지만 비밀번호 저장에도 좋습니다. PBKDF2 예를 들어 솔트, 많은 반복 횟수 및 우수한 해시 함수를 사용합니다.라이브러리가 있는 경우 이를 구현하는 항목(예:.NET), 고려해 보아야 할 것 같습니다.

을 추가하다 독특한 소금 해시된 비밀번호 값에 추가합니다(솔트 값을 db에 저장).언제 독특한 소금을 사용합니다 SHA1 또는 MD5보다 더 안전한 알고리즘을 사용하는 이점은 실제로 필요하지 않습니다(이 시점에서는 점진적인 개선인 반면 솔트를 사용하는 것은 엄청난 개선입니다).

MD5 또는 SHA1과 같은 강력한 암호화 해시 함수를 사용하세요. 소금, 그렇지 않으면 다음과 같은 일이 발생할 수 있습니다. 무지개 테이블 공격.

2013년 1월 업데이트

원래 답변은 2008년에 나온 것이며 지난 5년 동안 상황이 약간 바뀌었습니다.클라우드 컴퓨팅과 강력한 병렬 프로세서 그래픽 카드를 즉시 사용할 수 있다는 것은 MD5 또는 SHA1로 해시된 최대 8~9자의 비밀번호가 이제 쉽게 깨질 수 있음을 의미합니다.

이제 SHA512와 같이 더 강력한 것과 마찬가지로 긴 솔트가 필수입니다.

그러나 모든 SHA 변형 해시는 통신 암호화(모든 메시지가 암호화되어 주고받는 메시지)를 위해 설계되었습니다. 빠른.

비밀번호 해싱 세계에서 이 디자인은 해시 생성 속도가 빠를수록 많은 수의 해시를 생성하는 데 걸리는 시간이 줄어들기 때문에 큰 단점이 됩니다.

SHA512와 같은 빠른 해시는 초당 수백만, 심지어 수십억 번 생성될 수 있습니다.저렴한 병렬 처리를 사용하면 가능한 모든 비밀번호 순열이 필수가 됩니다.

키 스트레칭은 이 문제를 해결하는 한 가지 방법입니다.키 확장 알고리즘(예: PBKDF2)은 보다 빠른 해시(예: SHA512)를 수천 번 적용하므로 일반적으로 해시 생성에 1/5초 정도 소요됩니다.로그인하는 사람은 눈치채지 못하지만 초당 5개의 해시만 생성할 수 있다면 무차별 대입 공격이 훨씬 더 어려워집니다.

두 번째로 언제나 사용자별 무작위 솔트가 되어야 합니다.첫 번째로 무작위로 생성될 수 있습니다. N 해시 바이트(비교할 해시를 구축하기 전에 확인할 암호 텍스트에 제거되어 추가됨) 또는 추가 DB 열로 사용됩니다.

그래서:

데이터베이스에 비밀번호를 해시하려면 어떤 알고리즘을 사용해야 합니까?

  • 키 스트레칭 해시 생성 속도를 늦추기 위해.아마도 PBKDF2로 갈 것입니다.

  • 사용자별 소금 사용자당 새로운 공격이 발생하고 일부는 소금을 얻는 방법을 알아내는 작업을 의미합니다.

컴퓨팅 능력과 가용성은 기하급수적으로 증가하고 있습니다. 이러한 규칙은 향후 4년 내에 다시 변경될 가능성이 있습니다.미래 보장형 보안이 필요한 경우 bcrypt/scrypt 스타일 해시를 조사하겠습니다. 이러한 해시는 더 느린 키 확장 알고리즘을 사용하고 해시를 생성하기 위해 많은 RAM을 사용하는 단계를 추가합니다.RAM을 너무 많이 사용하면 값싼 병렬 프로세서의 효율성이 떨어집니다.

2008년 9월 원본(댓글이 이해가 되도록 남겨두었습니다)

MD5+salt 또는 SHA1+salt는 '사소하게 깨지지' 않습니다. 대부분의 해킹은 거대한 레인보우 테이블에 의존하며 솔트를 사용하면 유용성이 떨어집니다. [update, now they are].

MD5+소금은 상대적으로 약한 옵션이지만 쉽게 깨지지는 않습니다. [update, now it is very easy to break].

SHA2는 512까지 확장됩니다. 쉽게 사용할 수 있는 키트로는 크랙하는 것이 거의 불가능합니다. [update, pretty easy up to 9 char passwords now] - 군사 벙커 어딘가에 크레이가 있을 거라고 확신하지만 [You can now rent this 'Cray' from Amazon]

모든 항목에 대해 무작위로 생성된 솔트 값과 결합된 MD5 또는 SHA

앞에서 언급한 것처럼 단순 해싱 알고리즘을 사용하면 안 되는 이유는 다음과 같습니다.

http://arstechnica.com/security/2012/08/passwords-under-assault/

그래서 다음과 같은 다른 것을 사용하십시오 http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

모든 해싱 알고리즘은 "사전 공격"에 취약합니다.이는 공격자가 가능한 비밀번호에 대한 매우 큰 사전을 갖고 있으며 모든 비밀번호를 해시하는 곳입니다.그런 다음 해당 해시 중 해독하려는 비밀번호의 해시와 일치하는 것이 있는지 확인합니다.이 기술을 사용하면 수백만 개의 비밀번호를 쉽게 테스트할 수 있습니다.이것이 바로 원격으로 예측할 수 있는 비밀번호를 피해야 하는 이유입니다.

그러나 사전 공격의 위협을 기꺼이 받아들인다면 MD5와 SHA1이 각각 충분할 것입니다.SHA1은 더 안전하지만 대부분의 응용 프로그램에서는 실제로 크게 개선되지 않습니다.

MD5 / SHA1 해시는 모두 좋은 선택입니다.MD5는 SHA1보다 약간 약합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top