我将把它用于用户密码系统,但我首先要确保我做得正确。这是我的测试代码:
函数 generateBlowfishSalt() {
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./';
$numChars = strlen($chars);
$盐='';
for($i = 0; $i < 22; ++$i) {
$salt .= $chars[mt_rand(0, $numChars - 1)];
}
返回$盐;
}
$password = 'foo';
$salt = generateBlowfishSalt();
$hash1 = crypt($password, '$2a$12$' . $salt);
$hash2 = crypt($password, $hash1);
$比较 = ($hash1 == $hash2);
printf('密码: %s</br>', $password);
printf('salt: %s</br>', $salt);
printf('hash1: %s</br>', $hash1);
printf('hash2: %s</br>', $hash2);
printf('比较:' . $compare);
这是一个示例输出:
密码:foo 盐:MYVJ32OqLcMGBar3pUa.0S hash1: $2a$12$MYVJ32OqLcMGBar3pUa.0OTRwv6UX0bcxnSmheKOcqjvqvCrM/p2q hash2: $2a$12$MYVJ32OqLcMGBar3pUa.0OTRwv6UX0bcxnSmheKOcqjvqvCrM/p2q 比较:1
我的主要问题是:
我是否正确生成了 22 个字符的盐?我见过
base64_encode()的一些实现用于生成盐。我需要这样做吗?将整个
$hash1值存储在数据库中并且不存储单独的盐值是否正确,因为$hash1其中会有盐,这就是我验证密码所需的全部内容?在 PHP
crypt()文档页面上,该CRYPT_BLOWFISH示例的结尾$是 salt 参数(它是:)'$2a$07$usesomesillystringforsalt$'。但在所有的例子中,我看到没有人使用尾随$. 它是可选的吗?
谢谢