저는 이것을 사용자 암호 시스템에 사용하려하지만, 먼저 올바르게하고 싶습니다.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
내 주요 질문
은 다음과 같습니다내가 정확하게 22 문자 salt를 생성하는 건가요? 내가 본 일부 구현에서는
base64_encode()
을 사용하여 소금을 생성합니다. 그 일을해야합니까?$hash1
값을 데이터베이스에 저장하고$hash1
에 소금이 들어 있으므로 비밀번호를 확인해야하므로 별도의 소금 값을 저장하지 않는 것이 맞습니까?CRYPT_BLOWFISH
예제가 가지고있는 PHPcrypt()
문서 페이지에서- 소금 인수에 대해
$
후행 (:'$2a$07$usesomesillystringforsalt$'
그것은이의)가. 그러나 내가 본 모든 예에서 아무도 후행$
을 사용하지 않습니다. 선택 사항입니까?
감사
소금이 무작위가 아닌가요? mt_rand()를 사용하여 생성합니다. 나는 crypt()에 의해 반환 된 값이 거의 소금을 가지고 있기 때문에 crypt()가 반환하는 값 위에 별도의 소금 값을 저장해야한다고 생각하지 않습니다. 또한 암호를 확인하기 위해 crypt()에 대한 첫 번째 호출에서 반환 된 값만 필요합니다. – Ryan
예, 추가 작업이 필요하지 않습니다. 넌 무작위로 소금을 만들어 내고있어. 나는 "너는 소금을 바르게 먹고있어."라고 꽤 확신한다. 그냥 반복해라. 당신은 올바른 생각을 가지고 있습니다. – Andy