我将把它用于用户密码系统,但我首先要确保我做得正确。这是我的测试代码:
函数 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$'
。但在所有的例子中,我看到没有人使用尾随$
. 它是可选的吗?
谢谢