MD5不可逆加密

MD5公开的算法,任何语言实现后都一样,通用的;

不可逆加密:原文--加密--密文,密文无法解密出原文;

相同原文加密的结果是一样的;

不同长度的内容加密后都是32位;

不管文件多大,都能产生32位长度摘要;

用途:

1.防篡改(比对密文,判断是否修改过 例如:git)

2.密码保存,防止看到明文(登录时比对密文,加盐)

3.防止抵赖,数字签名。

code:

复制代码
        /// <summary>
        /// 对字符串加密
        /// </summary>
        /// <param name="sourse">字符串</param>
        /// <param name="length">位数</param>
        /// <returns></returns>
        public async Task<string> Encrypt(string sourse, int length = 32)
        {
            if (string.IsNullOrEmpty(sourse)) return string.Empty;
            //得到一个加密对象(使用的MD5)
            HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
            byte[] bytes = Encoding.UTF8.GetBytes(sourse);//将字符串转换为byte数组
            byte[] hashValue = provider.ComputeHash(bytes);
            var strBuilder = new StringBuilder();
            switch (length)
            {
                case 16://16位密文是32位密文的9到24位字符
                    for (int i = 4; i < 24; i++)
                    {
                        //转化为小写的16进制
                        strBuilder.Append(hashValue[i].ToString("x2"));
                    }
                    break;
                case 32:
                    for (int i = 0; i < 16; i++)
                    {
                        strBuilder.Append(hashValue[i].ToString("x2"));
                    }
                    break;
                default:
                    for (int i = 0; i < hashValue.Length; i++)
                    {
                        strBuilder.Append(hashValue[i].ToString("x2"));
                    }
                    break;
            }
            return strBuilder.ToString();//返回密文
        }
        /// <summary>
        /// 获取文件的MD5摘要
        /// </summary>
        /// <param name="fileName">文件的绝对路径</param>
        /// <returns></returns>
        public async Task<string> AbstractFile(string fileName)
        {
            //得到文件流
            using (FileStream file = new FileStream(fileName, FileMode.Open))
            {
                return await AbstractFile(file);
            }
        }

        /// <summary>
        /// 根据Stream获取文件摘要
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        public async Task<string> AbstractFile(Stream stream)
        {
            //创建一个MD5的对象
            var md5 = new MD5CryptoServiceProvider();
            //通过文件流获得byte数组
            byte[] retVal = md5.ComputeHash(stream);
            var strBuilder = new StringBuilder();
            for (int i = 0; i < retVal.Length; i++)
            {
                strBuilder.Append(retVal[i].ToString("x2"));
            }
            return strBuilder.ToString();
        }
复制代码

 

作者:江北

出处:https://www.cnblogs.com/zhangnever/p/12426571.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

微信:CodeDoraemon

posted @   江北、  阅读(823)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
晓看天色暮看云