2012-05-20 3 views
4

저는 이것을 사용자 암호 시스템에 사용하려하지만, 먼저 올바르게하고 싶습니다.PHP에서 CRYPT_BLOWFISH를 올바르게 사용하고 있습니까?

function generateBlowfishSalt() { 
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./'; 
    $numChars = strlen($chars); 
    $salt = ''; 

    for($i = 0; $i < 22; ++$i) { 
     $salt .= $chars[mt_rand(0, $numChars - 1)]; 
    } 

    return $salt; 
} 

$password = 'foo'; 
$salt = generateBlowfishSalt(); 
$hash1 = crypt($password, '$2a$12$' . $salt); 
$hash2 = crypt($password, $hash1); 
$compare = ($hash1 == $hash2); 

printf('password: %s</br>', $password); 
printf('salt: %s</br>', $salt); 
printf('hash1: %s</br>', $hash1); 
printf('hash2: %s</br>', $hash2); 
printf('compare: ' . $compare);

다음은 샘플 출력 : 여기에 내 테스트 코드는

password: foo 
salt: MYVJ32OqLcMGBar3pUa.0S 
hash1: $2a$12$MYVJ32OqLcMGBar3pUa.0OTRwv6UX0bcxnSmheKOcqjvqvCrM/p2q 
hash2: $2a$12$MYVJ32OqLcMGBar3pUa.0OTRwv6UX0bcxnSmheKOcqjvqvCrM/p2q 
compare: 1

내 주요 질문

은 다음과 같습니다

  1. 내가 정확하게 22 문자 salt를 생성하는 건가요? 내가 본 일부 구현에서는 base64_encode()을 사용하여 소금을 생성합니다. 그 일을해야합니까?

  2. $hash1 값을 데이터베이스에 저장하고 $hash1에 소금이 들어 있으므로 비밀번호를 확인해야하므로 별도의 소금 값을 저장하지 않는 것이 맞습니까? CRYPT_BLOWFISH 예제가 가지고있는 PHP crypt() 문서 페이지에서

  3. 소금 인수에 대해 $ 후행 (: '$2a$07$usesomesillystringforsalt$' 그것은이의)가. 그러나 내가 본 모든 예에서 아무도 후행 $을 사용하지 않습니다. 선택 사항입니까?

감사

답변

0

올바르게 소금을 다하고 있습니다. 그냥 임의적이어야합니다. 이 무작위 생성을위한 여러 가지 방법이 있습니다. 어떤 사람들은 날짜 시간 외에도 그것을 사용합니다. 또한, 더 긴 소금은 어쨌든 잘릴 것입니다. 최소한 crypt()와 관련해서는 일정한 길이가 필요합니다. 그래서 조금 여분의 패딩을하면 기분이 좋아집니다.

당신은 데이터베이스에 소금을 저장한다고 가정합니다. 나는 그것을 처음에는 이해하는 데 어려움이있었습니다. 소금의 전체적인 요점은 방대한 암호 목록을 사용하여 암호를 무지개 식 테이블에 오래 걸리는 것입니다. 또한 수정 사항이 동일하거나 둘 이상의 암호가있을 경우 도움이됩니다. 그렇다면 해시는 무작위적인 염으로 인해 여전히 달라질 것입니다.

crypt()는 PHP 용 DOC의 모양과 길이가 같을 때까지 테스트를 계속합니다. 그러나 틀린 것처럼 보입니다.

+0

소금이 무작위가 아닌가요? mt_rand()를 사용하여 생성합니다. 나는 crypt()에 의해 반환 된 값이 거의 소금을 가지고 있기 때문에 crypt()가 반환하는 값 위에 별도의 소금 값을 저장해야한다고 생각하지 않습니다. 또한 암호를 확인하기 위해 crypt()에 대한 첫 번째 호출에서 반환 된 값만 필요합니다. – Ryan

+0

예, 추가 작업이 필요하지 않습니다. 넌 무작위로 소금을 만들어 내고있어. 나는 "너는 소금을 바르게 먹고있어."라고 꽤 확신한다. 그냥 반복해라. 당신은 올바른 생각을 가지고 있습니다. – Andy

관련 문제