美文网首页工具癖
MD5加密验证字符操作辅助类MD5Util

MD5加密验证字符操作辅助类MD5Util

作者: 05b0963bb480 | 来源:发表于2018-12-20 22:22 被阅读0次

    实现效果

    1. 本辅助类主要是用来方便实现MD5各种长度加密字符、验证MD5等操作。
    2. MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的散列算法之一。
    3. MD5已经广泛使用在为文件传输提供一定的可靠性方面。例如,服务器预先提供一个MD5校验和,用户下载完文件以后,用MD5算法计算下载文件的MD5校验和,然后通过检查这两个校验和是否一致,就能判断下载的文件是否出错。

    实现步骤

    在代码引用相关的代码实现动态调用。

    实现代码

    1. 辅助类提供的方法接口如下所示:
    /// 获得32位的MD5加密
    public static string GetMD5_32(string input)
    /// 获得16位的MD5加密
    public static string GetMD5_16(string input)
    /// 获得8位的MD5加密
    public static string GetMD5_8(string input)
    /// 获得4位的MD5加密
    public static string GetMD5_4(string input)
    /// 添加MD5的前缀,便于检查有无篡改
    public static string AddMD5Profix(string input)
    /// 移除MD5的前缀
    public static string RemoveMD5Profix(string input)
    /// 验证MD5前缀处理的字符串有无被篡改
    public static bool ValidateValue(string input)
    /// 对给定文件路径的文件加上标签
    public static bool AddMD5(string path)
    /// 对给定路径的文件进行验证,如果一致返回True,否则返回False
    public static bool CheckMD5(string path)
    
    1. 辅助类MD5Util的使用例子代码如下所示:
    //为文件增加MD5编码标签,然后验证是否被修改
    string file = @"d:  estmd5.xls";
    bool flag1 = MD5Util.AddMD5(file);
    Console.WriteLine(flag1);
    //对给定路径的文件进行验证,如果一致返回True,否则返回False
    bool flag2 = MD5Util.CheckMD5(file);
    Console.WriteLine(flag2);
    

    附上源码

        /// <summary>
        /// MD5各种长度加密字符、验证MD5等操作辅助类
        /// </summary>
        public class MD5Util
        {
            /// <summary>
            /// 构造函数
            /// </summary>
            public MD5Util()
            {
            }
    
            /// <summary>
            /// 获得32位的MD5加密
            /// </summary>
            public static string GetMD5_32(string input)
            {
                System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
                byte[] data = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(input));
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < data.Length; i++)
                {
                    sb.Append(data[i].ToString("x2"));
                }
                return sb.ToString();
            }
    
            /// <summary>
            /// 获得16位的MD5加密
            /// </summary>
            public static string GetMD5_16(string input)
            {
                return GetMD5_32(input).Substring(8, 16);
            }
    
            /// <summary>
            /// 获得8位的MD5加密
            /// </summary>
            public static string GetMD5_8(string input)
            {
                return GetMD5_32(input).Substring(8, 8);
            }
    
            /// <summary>
            /// 获得4位的MD5加密
            /// </summary>
            public static string GetMD5_4(string input)
            {
                return GetMD5_32(input).Substring(8, 4);
            }
    
            /// <summary>
            /// 添加MD5的前缀,便于检查有无篡改
            /// </summary>
            public static string AddMD5Profix(string input)
            {
                return GetMD5_4(input) + input;
            }
    
            /// <summary>
            /// 移除MD5的前缀
            /// </summary>
            public static string RemoveMD5Profix(string input)
            {
                return input.Substring(4);
            }
    
            /// <summary>
            /// 验证MD5前缀处理的字符串有无被篡改
            /// </summary>
            public static bool ValidateValue(string input)
            {
                bool res = false;
                if (input.Length >= 4)
                {
                    string tmp = input.Substring(4);
                    if (input.Substring(0, 4) == GetMD5_4(tmp))
                    {
                        res = true;
                    }
                }
                return res;
            }
    
            #region MD5签名验证
    
            /// <summary>
            /// 对给定文件路径的文件加上标签
            /// </summary>
            /// <param name="path">要加密的文件的路径</param>
            /// <returns>标签的值</returns>
            public static bool AddMD5(string path)
            {
                bool IsNeed = true;
    
                if (CheckMD5(path)) //已进行MD5处理
                    IsNeed = false;
    
                try
                {
                    FileStream fsread = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
                    byte[] md5File = new byte[fsread.Length];
                    fsread.Read(md5File, 0, (int)fsread.Length);                               // 将文件流读取到Buffer中
                    fsread.Close();
    
                    if (IsNeed)
                    {
                        string result = MD5Buffer(md5File, 0, md5File.Length);             // 对Buffer中的字节内容算MD5
                        byte[] md5 = System.Text.Encoding.ASCII.GetBytes(result);       // 将字符串转换成字节数组以便写人到文件中
                        FileStream fsWrite = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
                        fsWrite.Write(md5File, 0, md5File.Length);                               // 将文件,MD5值 重新写入到文件中。
                        fsWrite.Write(md5, 0, md5.Length);
                        fsWrite.Close();
                    }
                    else
                    {
                        FileStream fsWrite = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
                        fsWrite.Write(md5File, 0, md5File.Length);
                        fsWrite.Close();
                    }
                }
                catch
                {
                    return false;
                }
    
                return true;
            }
    
            /// <summary>
            /// 对给定路径的文件进行验证,如果一致返回True,否则返回False
            /// </summary>
            /// <param name="path"></param>
            /// <returns>是否加了标签或是否标签值与内容值一致</returns>
            public static bool CheckMD5(string path)
            {
                try
                {
                    FileStream get_file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
                    byte[] md5File = new byte[get_file.Length];                                      // 读入文件
                    get_file.Read(md5File, 0, (int)get_file.Length);
                    get_file.Close();
    
                    string result = MD5Buffer(md5File, 0, md5File.Length - 32);             // 对文件除最后32位以外的字节计算MD5,这个32是因为标签位为32位。
                    string md5 = System.Text.Encoding.ASCII.GetString(md5File, md5File.Length - 32, 32);   //读取文件最后32位,其中保存的就是MD5值
                    return result == md5;
                }
                catch
                {
                    return false;
                }
            }
    
            /// <summary>
            /// 计算文件的MD5值
            /// </summary>
            /// <param name="MD5File">MD5签名文件字符数组</param>
            /// <param name="index">计算起始位置</param>
            /// <param name="count">计算终止位置</param>
            /// <returns>计算结果</returns>
            private static string MD5Buffer(byte[] MD5File, int index, int count)
            {
                System.Security.Cryptography.MD5CryptoServiceProvider get_md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
                byte[] hash_byte = get_md5.ComputeHash(MD5File, index, count);
                string result = System.BitConverter.ToString(hash_byte);
    
                result = result.Replace("-", "");
                return result;
            } 
            #endregion
    
            private void Test()
            {
                string o = "i love u";
                o = AddMD5Profix(o);
                //o += " ";
                Console.WriteLine(o);
                Console.WriteLine(ValidateValue(o));
    
                o = RemoveMD5Profix(o);
                Console.WriteLine(o);
    
            }
        }
    

    相关文章

      网友评论

        本文标题:MD5加密验证字符操作辅助类MD5Util

        本文链接:https://www.haomeiwen.com/subject/byzlcqtx.html