c# 如何进行md5加密
先给结论:在 C# 里实现 MD5 确实很简单,几行代码就能跑起来。但必须把丑话说在前头——MD5 早就被证明不安全了,只适合用在非敏感场景,比如文件完整性校验、内部数据摘要。千万别拿它单独存密码,这已经是行业基本共识。 用 MD5.Create() 而不是 new MD5CryptoService

先给结论:在 C# 里实现 MD5 确实很简单,几行代码就能跑起来。但必须把丑话说在前头——MD5 早就被证明不安全了,只适合用在非敏感场景,比如文件完整性校验、内部数据摘要。千万别拿它单独存密码,这已经是行业基本共识。
用 MD5.Create() 而不是 new MD5CryptoServiceProvider()
.NET 6+ 直接把 MD5CryptoServiceProvider 标记为过时了,编译就报警告,摆明了让你别再用。官方推荐统一走工厂方法 MD5.Create(),它返回标准实现,配合 using 还能自动释放资源,省心省力。
using (MD5 md5 = MD5.Create()) { ... }❌ 避免写法:
new MD5CryptoServiceProvider()(新项目或 .NET 6/7/8+ 尤其注意)⚠️ 注意:
MD5.Create() 返回的是 HashAlgorithm 接口实现,类型安全,将来想换成 SHA256 也很方便——这点对后续升级很重要。
Encoding.UTF8.GetBytes() 是默认推荐,别碰 Encoding.Default
字符串转字节这一步看着简单,但编码选错了,哈希结果就不一致。不同系统上 Encoding.Default 可能代表 GBK、Shift-JIS 等本地编码,同一串文字在 Windows 和 Linux 上算出不同的 MD5,那调试起来可够头疼的。
Encoding.UTF8.GetBytes(input):跨平台、可重现,符合 Web 和现代协议惯例。❌ 不要用
Encoding.ASCII.GetBytes():中文、emoji 会被静默丢弃。❌ 避免
Encoding.Default:除非你明确知道所有运行环境的编码,并且接受不可移植性。
拼接十六进制字符串必须用 StringBuilder,别图省事用 +=
byte[] 转成 32 位小写十六进制字符串(比如 "e84d7e1a..."),需要遍历 16 个字节逐个格式化。如果用 string +=,字符串不可变,每次拼接都新建一个对象,16 次操作下来就产生了 16 个临时字符串。高频调用时(比如日志、批量校验),性能差距非常明显。
using System;
using System.Security.Cryptography;
using System.Text;
public static string ComputeMD5(string input)
{
using (MD5 md5 = MD5.Create())
{
byte[] bytes = Encoding.UTF8.GetBytes(input);
byte[] hash = md5.ComputeHash(bytes);
StringBuilder sb = new StringBuilder(32); // 预设容量,避免扩容
for (int i = 0; i < hash.Length; i++)
{
sb.Append(hash[i].ToString("x2")); // "x2" → 小写两位十六进制
}
return sb.ToString();
}
}
✅ StringBuilder + Append:零额外字符串分配,性能稳定。✅
"x2":确保每位补零(比如 0xa → "0a"),长度一致。⚠️
BitConverter.ToString(hash).Replace("-", "") 虽然代码短,但先生成带短横的字符串再替换,多一次内存分配,不推荐。
文件 MD5 计算要靠 FileStream,别全部读进内存
大文件(比如几百 MB 的安装包)做 MD5,如果贪方便用 File.ReadAllBytes(),一次性把整个文件塞进内存,很容易触发 OutOfMemoryException。正确的做法是流式计算——ComputeHash(Stream) 内部已经优化好了分块读取。
public static string ComputeFileMD5(string filePath)
{
if (!File.Exists(filePath))
throw new FileNotFoundException($"文件未找到: {filePath}");
using (MD5 md5 = MD5.Create())
using (FileStream fs = File.OpenRead(filePath))
{
byte[] hash = md5.ComputeHash(fs);
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
}
✅ File.OpenRead():只读、不共享、无缓存,最轻量的打开方式。✅
using 嵌套:确保 FileStream 和 MD5 都被及时释放。⚠️ 注意:千万不要在
ComputeHash 之后又调用 fs.Position = 0 或重用流——ComputeHash 已经消费了全部流内容。
最后再叮嘱一句:如果你正在写登录系统,看到这里就该打住了——MD5 加盐也不够用,立刻换成 Rfc2898DeriveBytes(PBKDF2)或 Argon2(需要 NuGet 包)。MD5 现在唯一体面的归宿,就是给配置文件打个指纹,或者验证下载包有没有被中间人篡改。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















