You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:40:55