2012-06-05 1 views
1

나는 mysql DB를 사용하여 사용자 테이블에 저장된 해시 및 소금에 대해 배우려고 노력하고 있습니다. 나는 그들을 저장하는 것으로 끝났지 만 사용자가 로그인 할 때 유효성을 검사하는 방법에 대해 머리를 감싸는 것처럼 보일 수는 없습니다.
소금과 해시를 별도로 저장하는 방법을 살펴 보았습니다. 제가 생산하는 소금은 무작위입니다.임의의 소금으로 암호 확인

아이디어가 있으십니까?
코드를 게시했습니다.

<?php 
$password = 'passwordwhatever'; 

//generate the salt 
function gen_salt() { 
    $salt = uniqid(mt_rand(), true) . sha1(uniqid(mt_rand(), true)); 
    $salt = crypt('sha512', $salt); 
    return $salt; 
} 

//generate the hash 
function gen_hash($salt, $password) { 
    $hash = $salt . $password; 
    for($i = 0; $i < 100000; $i++) { 
     $hash = crypt('sha512', $hash); 
    } 

    $hash = $salt . $hash; 
    return $hash; 
} 

$password = gen_hash(gen_salt(), $password); 
echo $password; 

?> 
+0

소금 생성은 덜 잔인한 방식으로 이루어질 수 있습니다. 단지'uniqid (mt_rand(), true)'는 그 목적을 위해 충분하고'sha512'를 추가하면 더 무작위 화하지 않을 것입니다 ;-) –

답변

0

소금은 데이터베이스 (또는 어딘가에) 어딘가에 포함될 필요가 있습니다. 일부 옵션은 해시에 소금을 추가하거나 자체 필드로 저장하는 것입니다. 해시에 추가하는 것이 좋습니다. 사용자가 로그인을 갈 때

$password = $salt . '.' . $hash; 

그런 다음, 당신은 자신의 암호를 잡아 해시와 소금으로 휴식 및 결정 (대신 임의의 소금의 암호에서 소금) 비밀번호 생성 기능을 사용 db의 암호와 일치하는 경우

list($salt,$hash) = explode('.', $password); 
$check = gen_hash($salt, $input_pass); 
if ($check === $password) 
    // valid 
2

동일한 소금을 생산하는 한 너무 중요하지 않습니다. 당신이 그것에 도착할 수있는 한, 윤곽에서 당신의 db에서 그것을 저장하십시오. SHA512 해시를 되 돌리려는 노력은 당신이 국방성이 아니라면 아무도 귀찮게하지 않을 것입니다. 요점은 동일한 소금으로 해시를 반복 할 수 있기를 원하므로 중요한 입력을 저장하지 않아도 입력 내용이 동일하다는 것을 확신 할 수 있습니다. 그 말이 맞는다면.

+0

돈을 쓰면됩니다. 나는 그런 소금을 암호화하는데 많은 노력을 기울일 필요가 없다고 말하려고했다. 가장 중요한 점은 무작위 적이기 때문에 매우 안전하다는 것입니다. 누군가 소금과 해시를 얻었을지라도 그 소금을 위해 특별히 무지개 테이블을 만드는 것은 계산적으로 실질적인 노력이 아닙니다. 나는 백 엔드에서 그것을 공개하지 말고, 공개적으로 사용자에게 공개하지 말고, 문자와 숫자의 무작위 문자열을 사용하면 충분히 안전합니다. –

+0

사이드 노트의 커플 : 1) 모든 암호에 대해 동일한 소금을 사용하지 마십시오. 각 소금은 암호마다 고유해야합니다. 조금씩 독특한 것은 아닙니다. 당신은 존재하지 않거나 아무것도 존재하지 않는다는 것을 확인할 필요가 없으며, 사실상 말하면 복제 가능성은 거의 없다. 2) 일반적으로 콜론 (:)을 구분 기호로 사용하여 해시로 소금을 저장합니다. 하지만 암호를 사용하여 다른 항목을 해시 할 수있는 경우 암호 표의 해당 열에 저장할 수 있습니다. –

0

아마도 bcrypt을 살펴 봐야 할 것입니다. This가 도움이됩니다. 나는 약간의 tutorials를 썼다. 그러나 그들은 독일에있다. 오, PHP 5.3은 기본적으로 bcrypt를 지원합니다.