我正要用这个来做一个用户密码系统 但我首先想确保我做对了。这是我的测试代码:
function generateBlowfishSalt() { $chars = 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./ ; $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个字符盐?一些我见过的用
base64_encode
() 生成盐的功能。 我需要这样做吗?在数据库中存储整个
$hash1
值而不另存一个盐值是否正确,因为$hash1
将含盐,而我只需要核实密码?在PHP
crypt ()
文档页面上,CRYPT_BLOWISH
示例有一个盐参数尾注$
<$
< < acode> <$ < < < $/code>> < < code> < $ < /code> < < code>< $ < /code> < < $ > < code> < acode> < $ < $2a$07$ use somesislystrting foralt$
。但在所有这些例子中,我从未看到任何人使用尾注<$
。
谢谢 谢谢