




php 与 c# 对同一密码加盐后生成的 sha256 哈希值不一致,通常源于盐(salt)与密码(password)拼接顺序不同:php 中误写为 `salt + password`,而 c# 中是 `password + salt`,导致哈希结果完全不同。修正拼接顺序即可实现跨语言哈希一致性。
在多平台身份认证场景中(如 ASP.NET 后端 + PHP 登录页),确保密码哈希逻辑完全一致至关重要。核心问题在于:哈希前的原始输入字符串必须严格相同。从您提供的代码可见:
✅ C# 正确逻辑(以 pw + salt 拼接):
byte[] hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(pw + salt)); return Convert.ToBase64String(hash);
❌ PHP 当前错误逻辑($salt . $extpassword → 相当于 salt + password):
$pw = $salt . $extpassword; // 错误:顺序颠倒!
return ($fromdb == base64_encode(hash('sha256', $pw, true)));✅ PHP 修正后(与 C# 保持 password + salt 顺序):
$pw = $extpassword . $salt; // 关键修复:先密码,后盐
// 确保 UTF-8 编码一致性(C# 默认使用 UTF-8)
if (!mb_check_encoding($pw, 'UTF-8')) {
$pw = 
mb_convert_encoding($pw, 'UTF-8');
}
$hash = base64_encode(hash('sha256', $pw, true));
return $fromdb === $hash;⚠️ 重要注意事项:
通过统一拼接顺序(password + salt)、校验编码、验证盐值原文,即可实现 PHP 与 C# 间 100% 兼容的哈希比对,为混合技术栈的身份系统提供可靠基础。