zoukankan      html  css  js  c++  java
  • 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();
            }
  • 相关阅读:
    matplotlib 进阶之origin and extent in imshow
    Momentum and NAG
    matplotlib 进阶之Tight Layout guide
    matplotlib 进阶之Constrained Layout Guide
    matplotlib 进阶之Customizing Figure Layouts Using GridSpec and Other Functions
    matplotlb 进阶之Styling with cycler
    matplotlib 进阶之Legend guide
    Django Admin Cookbook-10如何启用对计算字段的过滤
    Django Admin Cookbook-9如何启用对计算字段的排序
    Django Admin Cookbook-8如何在Django admin中优化查询
  • 原文地址:https://www.cnblogs.com/zhangnever/p/12426571.html
Copyright © 2011-2022 走看看