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

PHP与C#中PBKDF2哈希不匹配问题求助

PHP与.NET Core PBKDF2哈希不匹配的问题解决

问题根源

两边哈希不匹配的核心原因是salt的处理逻辑不一致:

  • PHP代码中,生成的$salt是原始随机字节的十六进制字符串,但调用hash_pbkdf2时直接传入了这个十六进制字符串——PHP会将该字符串的每个字符作为独立字节作为PBKDF2的salt(比如十六进制字符串"ab"会被当成字节0x61, 0x62,而非解码后的0xab)。
  • .NET代码中,将数据库取出的十六进制salt字符串解码成了原始字节数组(比如"ab"被解码为0xab),导致两边使用的salt完全不同,最终哈希结果必然不匹配。

解决方案

方案1:修改PHP代码(推荐,符合安全最佳实践)

使用原始随机字节作为salt计算哈希,仅将十六进制形式的salt存入数据库:

$rawSalt = random_bytes(64);
$salt = bin2hex($rawSalt); // 存入数据库的十六进制salt
$binPassword = hash_pbkdf2("sha512", "test", $rawSalt, 1000, 64, true);
$hashedPassword = bin2hex($binPassword);

修改后,.NET端现有代码无需改动,因为数据库中的十六进制salt对应原始的64字节salt,与.NET的hex2bin解码结果一致,哈希会自动匹配。

方案2:修改.NET代码(适配现有PHP数据)

如果无法修改PHP代码,需调整.NET端的salt处理逻辑,与PHP的行为对齐:

// 替换原有的hex2bin函数
static byte[] GetPhpStyleSaltBytes(string saltString)
{
    return Encoding.ASCII.GetBytes(saltString);
}

// 验证逻辑调整
byte[] saltBytes = GetPhpStyleSaltBytes(salt);
var pbkdf2 = new Rfc2898DeriveBytes(
    "test",
    saltBytes,
    1000,
    HashAlgorithmName.SHA512);
var hashBytes = pbkdf2.GetBytes(64);
var myHash = bin2hex(hashBytes);

此方法会让.NET使用与PHP完全相同的salt字节序列,从而生成匹配的哈希。


内容的提问来源于stack exchange,提问作者Howard Owen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:35:16