2012-06-20 2 views
0

나는 데이터베이스에 암호를 저장해야하고, 그래서 같이 반복 된 임의의 소금, 함께 소금에 절인 암호의 SHA1 해시를 저장하는 데 사용 :hmac 해시를 반복하는 것이 유용합니까?

$salt = sha1(microtime().mt_rand()); 
for ($i=0; $i < 4000; $i++) { 
    $password = sha1($password.$salt); 
} 

(내 예에서, $password$salt은 db 안에 저장되었습니다.

저는 최근에 hash_hmac() 기능을 발견했습니다.이 기능은 단순한 SHA1 해시보다 훨씬 안전합니다. 같은 패턴 (소금이 비밀 키)으로 사용하려고 계획하고 있지만 이전 예제 에서처럼 반복 할만한 가치가 있는지 궁금해하고있었습니다. 누군가가 내게 어떤 통찰력을 줄 수 있다면, 그것은 크게 감사 할 것입니다.

답변

2

예.

당신이 여기에서하는 일은 key stretching으로 알려져 있으며 공격자가 각 후보 암호를 해시에 대해 확인하기 위해 취해야하는 시간을 곱합니다. 예를 들어, 시간이 4000x 증가합니다. 여기에서 보호하려는 특정 위협은 공격자가 해시 (예 : LinkedIn, Last.fm 및 eHarmony와 최근 발생한 문제)를 파악하고 공격을받을 수있는만큼의 CPU 성능을 사용할 수있는 경우입니다.

연구 프로젝트가 아닌 다른 프로젝트라면 bcrypt(), PBKDF2() 또는 scrypt()과 같이 잘 알려진 공개적으로 테스트 된 기능을 사용해야합니다.

루프의 숫자가 4000보다 훨씬 커야하며 공격자가 PHP 루프가 아닌 C 루프를 사용하기 때문에 합리적인 시간 내에 많은 수의 작업을 수행 할 수 없습니다. PHP 루프에서도 0.3 초 ​​만에 500,000을 할 수 있습니다. 위의 해시 알고리즘은 C. (Not all of them may be available in PHP)에서 구현되기 때문에이 문제를 해결합니다. bcrypt이 5.3에 있지만 CRYPT_BLOWFISH이라고합니다. Details on how to use it are on the crypt() page.


hash_hmac()더 안전한 해싱 알고리즘되는 것이 아니라 다른 목적을 위해 사용됩니다. the end of Thomas' answer here을 참조하십시오. MD5SHA 패밀리와 같은 알고리즘은 일반적으로 특정 목적을 위해보다 구체적인 알고리즘의 일부로 사용되는 범용 해싱 알고리즘입니다. 예를 들어, 위의 암호 해싱 알고리즘 중 일부는 범용 해싱 알고리즘을 여러 번 사용합니다. has_hmac()은 사용하고자하는 범용 해싱 알고리즘을 묻습니다.

관련 문제