发布于2026-07-08 阅读(0)
扫一扫,手机访问
MD5 加密在 C# 里跑起来确实很快,但有一个前提你必须清楚:它已经不安全了,只适合用在非敏感场景下,比如文件校验、内部数据摘要这类地方。要是你正打算拿它存用户密码——赶紧打住。这不是“够不够用”的问题,而是在给自己埋雷。
在 .NET 6+ 的版本里,MD5CryptoServiceProvider 已经被标记为过时,编译时就会给你弹警告,以后版本很可能直接移除。官方统一入口是工厂方法 MD5.Create(),它返回 HashAlgorithm 接口,这样日后要切换到 SHA256 或 SHA512 也方便,无需改太多代码。
using (MD5 md5 = MD5.Create()) { ... }new MD5CryptoServiceProvider()(尤其新项目,别用)MD5.Create() 会自动处理资源释放,配合 using 能防止内存泄漏字符串转字节这一步,一旦编码用错,同一输入在 Windows 和 Linux 上会算出不同的 MD5——这不是 bug,是你没控制住变量。所以务必固定用 Encoding.UTF8.GetBytes(input),它跨平台、可复现,而且 Web 标准也认它。
Encoding.UTF8.GetBytes(input)Encoding.ASCII.GetBytes():中文、emoji 全丢,静默失败Encoding.Default:Windows 默认可能是 GBK,Linux 可能是 UTF-8,结果不可控MD5 输出是 16 字节,得转成 32 位小写十六进制字符串(比如 "e84d7e1a...")。如果傻傻地用 string += 循环拼接,每次都会新建字符串对象,16 次操作实际分配 16 个临时字符串——高频调用(比如日志批量打点)时性能明显下滑。
StringBuilder sb = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) sb.Append(hashBytes[i].ToString("x2"));string result = ""; for (...) result += hashBytes[i].ToString("x2");"x2" 表示两位小写十六进制,"X2" 是大写;别漏掉 2,否则单字节可能只输出一位(比如 0xa → "a")MD5 碰撞攻击已经实操可行,彩虹表满天飞,GPU 每秒能穷举上亿次。你写的 ComputeMD5("123456"),结果几乎是公开可查的。
MD5(password) 存数据库、JWT payload、配置文件Rfc2898DeriveBytes(PBKDF2),也可以上第三方 BCrypt.Net-Next 或 Argon2
真正难的不是写一个能跑的 MD5 函数,而是判断它该不该出现在你的代码里。很多线上系统还在用 MD5 存密码,不是因为不会换,而是没意识到:那个看似“只是校验一下”的调用,正在把用户凭据摊开在攻击者面前。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8