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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:46:03