C# 项目里存了一批 MD5 的密码哈希,审计要求整改,业务方说能不能直接解密还原。很多人在论坛上发帖求 C# md5 解密代码,以为有个逆函数能跑回去。

MD5 没有解密这回事

MD5 是单向散列,任意长度输入变成 128 位输出,信息已经丢了,从数学上无法逆推。网上所谓的 MD5 解密站,本质是存了几十亿条明文和哈希的对照表,输入常见密码能撞上,随机密码就撞不上。拿复杂密码去查,返回空很正常。

C# 里怎么算 MD5

using (var md5 = System.Security.Cryptography.MD5.Create()) { var bytes = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(pwd)); var sb = new System.Text.StringBuilder(); foreach (var b in bytes) sb.Append(b.ToString(x2)); }

字符集必须固定用 UTF8,中文一个字三个字节,换成默认编码结果就变了。输出统一小写 32 位 hex,比较时两边都转小写,别卡在这个细节上。

登录验证的正确写法

注册时存 MD5 加盐之后的结果,登录时对用户输入做同样的加盐哈希,比对字符串是否相等。盐用随机生成的 16 字节,存在数据库另一列。别用固定盐,撞库一破全破。

想提升安全怎么办

  • 换算法:新项目用 bcrypt 或 PBKDF2,.NET 有对应库,计算慢反而防暴力破解。
  • 历史数据:下次登录时用旧 MD5 校验通过,顺手按新算法重算存库,平滑过渡。
  • 别自己拼:自己写三轮 MD5 套娃,不如用标准算法加标准参数。

什么时候该改

涉及密码、支付、身份鉴别的旧系统,MD5 只够做文件完整性校验。彩虹表对 8 位纯数字密码几乎秒破,撞库成本一年比一年低。升级方案和数据迁移脚本一起评审,别只改新注册的老数据还躺在库里。