ASP.NET实现PHP sha1(md5($Password))哈希方法失效求助
问题根因
你的代码和PHP原生sha1(md5($Password))的执行逻辑存在两处核心偏差,直接导致哈希结果不匹配:
- PHP内置
md5()函数默认返回32位小写十六进制格式的哈希字符串,既不是原始二进制哈希值,也不是Base64编码结果。你在代码中把MD5计算得到的二进制字节直接转成了Base64字符串,这一步的中间结果和PHP输出完全不一致。 - 后续SHA1计算环节,你传入的是Base64字符串的字节数组,和PHP中接收md5输出的32位十六进制字符串作为输入的逻辑完全不符,最终结果自然无法通过验证。
可直接替换的正确实现
using System; using System.Security.Cryptography; using System.Text; public static class Crypto { public static string GetSha1MD5Pass(string value) { // 计算MD5哈希,对齐PHP md5()默认输出32位小写十六进制字符串的行为 using (MD5 md5Inst = MD5.Create()) { byte[] pwdBytes = Encoding.ASCII.GetBytes(value); byte[] md5Raw = md5Inst.ComputeHash(pwdBytes); StringBuilder md5Hex = new StringBuilder(); foreach (byte b in md5Raw) { md5Hex.Append(b.ToString("x2")); // 小写十六进制,和PHP默认输出一致 } string md5Result = md5Hex.ToString(); // 对MD5得到的十六进制字符串计算SHA1,对齐PHP sha1()默认行为 using (SHA1 sha1Inst = SHA1.Create()) { byte[] md5StrBytes = Encoding.ASCII.GetBytes(md5Result); byte[] sha1Raw = sha1Inst.ComputeHash(md5StrBytes); StringBuilder sha1Hex = new StringBuilder(); foreach (byte b in sha1Raw) { // 若PHP端存储的是大写哈希,将"x2"改为"X2"即可 sha1Hex.Append(b.ToString("x2")); } return sha1Hex.ToString(); } } } }
补充说明
- 原有调用逻辑不需要修改,保持原来的参数传参方式即可:
command.Parameters.AddWithValue("@pwd", Crypto.GetSha1MD5Pass(password));
- 如果你的PHP环境使用UTF-8编码处理包含非ASCII字符(比如中文、特殊符号)的密码,将代码中两处
Encoding.ASCII替换为Encoding.UTF8,保证两边字符串编码一致才能得到相同哈希结果。
内容的提问来源于stack exchange,提问作者Invictus
相关产品推荐
相关产品推荐

