PHP crypt()函数输入不同却输出相同,是否属于PHP Bug?
关于PHP crypt()函数输入不同却得到相同哈希值的问题
问题描述
执行以下PHP代码:
$var1 = crypt('rasmuslerdorf', 'cd'); $var2 = crypt('rasmuslerdorfWhatever', 'cd');
得到的输出均为cdqYxeZGYiRPw,且在PHP 8.1.2和7.4.16版本中均出现此现象。查阅PHP官方文档,仅提及哈希输出的相关说明:
Returns the hashed string or a string that is shorter than 13 characters and is guaranteed to differ from the salt on failure.
对此行为存在疑问,询问是否属于正常现象。
解答
这是正常行为,核心原因在于你使用的是传统DES加密算法(由两位字符的盐cd指定),而DES算法本身仅会使用输入字符串的前8个字符进行哈希计算。
你的两个输入字符串前8位完全一致(均为rasmusler),DES算法会直接忽略8位之后的所有内容,因此最终生成的哈希值完全相同。
PHP的crypt()函数会根据盐的格式自动匹配对应哈希算法:
- 两位字符的盐对应传统DES算法
- 以
$1$开头的盐对应MD5算法 - 以
$2y$开头的盐对应BCrypt算法(推荐用于密码哈希场景)
若要避免这种输入截断的行为,建议使用支持任意长度输入的安全哈希算法,比如BCrypt,PHP提供了更易用的password_hash()和password_verify()函数:
// 使用BCrypt算法生成哈希,自动生成安全盐 $hash1 = password_hash('rasmuslerdorf', PASSWORD_DEFAULT); $hash2 = password_hash('rasmuslerdorfWhatever', PASSWORD_DEFAULT); // 验证哈希值 if (password_verify('rasmuslerdorf', $hash1)) { echo '验证通过'; }
注:PHP官方文档未明确提及DES算法的输入长度限制,是因为这属于该算法本身的特性,并非PHP实现的问题。
内容的提问来源于stack exchange,提问作者simo
相关产品推荐
相关产品推荐

