php与c#实现sha256加盐哈希时,若盐值(salt)与密码的拼接顺序不一致(如php用`salt + password`而c#用`password + salt`),将导致哈希结果完全不同;统一拼接顺序是跨语言验证密码的前提。
要使 PHP 登录逻辑能正确校验由 C# 生成的 SHA256+Salt 密码哈希,核心前提是两端对原始输入字符串的构造方式完全一致。从你提供的代码可见关键差异:
这直接导致输入到 SHA256 的字节序列不同,哈希值必然不匹配。
PHP 端应修正为:
$pw = $extpassword . $salt; // 注意顺序:先密码,后盐
if (!mb_check_encoding($pw, 'UTF-8')) {
$
pw = mb_convert_encoding($pw, 'UTF-8');
}
$hash = base64_encode(hash('sha256', $pw, true));
return $hash === $fromdb;C# 端(保持不变,已正确):
var input = pw + salt; // 密码 + 盐 byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(input)); return Convert.ToBase64String(hashBytes);
统一拼接顺序是跨语言哈希互通的第一步;在此基础上保障编码、数据类型与安全强度的一致性,才能构建可靠、可互操作的身份验证体系。