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
相关产品推荐
相关产品推荐

