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();
            }
  • 相关阅读:
    IDEA 基本配置
    IDEA 创建一个普通的java项目
    Intellij Idea 创建一个Web项目
    override的实现原理
    elasticsearch 复杂查询小记
    post 中文数据到elasticsearch restful接口报json_parse_exception 问题
    String intern()方法详解
    JVM的DirectMemory设置
    深入浅出 JIT 编译器
    为什么 JVM 不用 JIT 全程编译
  • 原文地址:https://www.cnblogs.com/zhangnever/p/12426571.html
Copyright © 2011-2022 走看看