开发手册 欢迎您!
软件开发者资料库

.NET(C#) MD5(Message-Digest Algorithm 5)加密实现代码

MD5(Message-Digest Algorithm 5)是一种哈希算法,用来保证信息的完整性。它是一种不可逆的加密,对不同的数据加密的结果是定长的32位字符。已知原数据和其 MD5 值,要找到一个具有相同 MD5 值的数据(即伪造数据)是非常困难的。若要找到两个不同数据,使他们具有相同的 MD5 值,也是非常困难的。本文主要介绍.NET(C#) MD5加密实现代码。

1、MD5简介

MD5(Message-Digest Algorithm 5)的全称是md5信息摘要算法,一种被广泛使用的密码散列函数,可以产生一个128位(16字节,1字节8位)的散列值(常见的是用32位的16进制表示,比如:0b1a3b23b8da42f9f4e241d85dc4da2c),用于确保信息传输的完整一致。一般可以用于密码管理,当我们需要保存某些密码信息以用于身份确认时,如果直接将密码信息以明码方式保存在数据库中,不使用任何保密措施,系统管理员就很容易能得到原来的密码信息,这些信息一旦泄露, 密码也很容易被破译。为了增加安全性,有必要对数据库中需要保密的信息进行加密,这样,即使有人得到了整个数据库,如果没有解密算法,也不能得到原来的密码信息。还可以用于电子签名,MD5 算法还可以作为一种电子签名的方法来使用,使用 MD5算法就可以为任何文件(不管其大小、格式、数量)产生一个独一无二的“数字指纹”,借助这个“数字指纹”,通过检查文件前后 MD5 值是否发生了改变,就可以知道源文件是否被改动。也可以垃圾邮件筛选,在电子邮件使用越来越普遍的情况下,可以利用 MD5 算法在邮件接收服务器上进行垃圾邮件的筛选,以减少此类邮件的干扰。

2、MD5加密的实现代码

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Security.Cryptography;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication{    class Program    {        static void Main(string[] args)        {            Console.WriteLine(MD5Encrypt.Encrypt("C"));            Console.WriteLine(MD5Encrypt.Encrypt("C#"));            Console.WriteLine(MD5Encrypt.Encrypt("Java"));            Console.WriteLine(MD5Encrypt.Encrypt("CJavaPy"));            Console.ReadKey();        }    }    ///     /// 不可逆加密    /// 1 防止被篡改    /// 2 防止明文存储    /// 3 防止抵赖,数字签名    ///     public class MD5Encrypt    {        #region MD5        ///         /// MD5加密,和动网上的16/32位MD5加密结果相同,        /// 使用的UTF8编码        ///         /// 待加密字串        /// 16或32值之一,其它则采用.net默认MD5加密算法        /// 加密后的字串        public static string Encrypt(string source, int length = 32)//默认参数        {            if (string.IsNullOrEmpty(source)) return string.Empty;            HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;            byte[] bytes = Encoding.UTF8.GetBytes(source);//这里需要区别编码的            byte[] hashValue = provider.ComputeHash(bytes);            StringBuilder sb = new StringBuilder();            switch (length)            {                case 16://16位密文是32位密文的9到24位字符                    for (int i = 4; i < 12; i++)                    {                        sb.Append(hashValue[i].ToString("x2"));                    }                    break;                case 32:                    for (int i = 0; i < 16; i++)                    {                        sb.Append(hashValue[i].ToString("x2"));                    }                    break;                default:                    for (int i = 0; i < hashValue.Length; i++)                    {                        sb.Append(hashValue[i].ToString("x2"));                    }                    break;            }            return sb.ToString();        }        #endregion MD5        #region MD5摘要        ///         /// 获取文件的MD5摘要        ///         ///         ///         public static string AbstractFile(string fileName)        {            using (FileStream file = new FileStream(fileName, FileMode.Open))            {                return AbstractFile(file);            }        }         ///         /// 根据stream获取文件摘要        ///         ///         ///         public static string AbstractFile(Stream stream)        {            MD5 md5 = new MD5CryptoServiceProvider();            byte[] retVal = md5.ComputeHash(stream);             StringBuilder sb = new StringBuilder();            for (int i = 0; i < retVal.Length; i++)            {                sb.Append(retVal[i].ToString("x2"));            }            return sb.ToString();        }        #endregion    } }