MD5的使用

    最近在做练手的小项目,做工具类的时候,首先就写了使用MD5进行加密的算法。所以小小记录一下简单的MD5的使用,已经一些我所能想到的MD5的一些提高安全性的方法。

1 什么是MD5

     MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。(文字来源:百度百科)。

    MD5具有数据一致性、不可逆性,故可用来进行数据一致性校验。比如:密码校验、文件校验。那么现在就上代码看一下,具体怎么写。值得一提的是,目前有16位,32位两种MD5值,16位值是将32位的MD5值去掉前八位,后八位后得到的( 8+18+8 怎么都觉得像是在说切分音)。

2 实现      

         /// 
        /// 字符串转换为MD5 this扩展方法 对应类应该为静态类
        /// 
        /// 待转化字符
        /// 
        public static string CalcMD5(this string str)
        {
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(str);
            return CalcMD5(bytes);
        }
        /// 
        /// 数组转换为MD5
        /// 
        /// 数组
        /// 
        public static string CalcMD5(byte[] bytes)
        {
            using (MD5 md5 = MD5.Create())
            {
                byte[] computeBytes = md5.ComputeHash(bytes);
                string result = "";
                for (int i = 0; i < computeBytes.Length; i++)
                {
                    result += computeBytes[i].ToString("X").Length == 1 ? "0" + 
                       computeBytes[i].ToString("X") : computeBytes[i].ToString("X");
                }
                return result;
            }
        }
        /// 
        /// 流转为MD5
        /// 
        /// 流
        /// 
        public static string CalcMD5(Stream stream)
        {
            using (MD5 md5 = MD5.Create())
            {
                byte[] computeBytes = md5.ComputeHash(stream);
                string result = "";
                for (int i = 0; i < computeBytes.Length; i++)
                {
                    result += computeBytes[i].ToString("X").Length == 1 ? "0" + 
                        computeBytes[i].ToString("X") : computeBytes[i].ToString("X");
                }
                return result;
            }
        }

    那么来看一下,在这里是将MD5算法作为string的扩展方法来使用,这样的话,在使用的时候需要将类定义为静态类(static)。当然啦,也可以去掉this。这里一共有三个MD5方法:1、字符串转MD5  2、数组转MD5 3、流转MD5,后续可以根据这几个方法在扩展,比如流的MD5,可以传入文件路径,来计算MD5,这个自己去扩展就好了

 3 一些思考

   虽说MD5 是不可逆的,但是可以被暴力破解。MD5值并不是唯一的,一个数据,对应一个唯一的MD5值,一个MD5值对应多个数据。那么如何提高数据的安全性呢,我这里提供两个思路

 (1)MD5值截取

    此方法也就是对MD5值进行数据处理,举个例子,数据计算出来MD5值之后,截取指定长度的数据,再拼接进去另一段随机数,将结果和随机数(可以再次进行一定的加密或者加盐操作)都保存到数据库中,使用的时候进行同样的处理就可以了。这样一旦数据库被攻破,即使数据被拿到之后,也很难对数据进行破解

  (2)原始数据加盐

    此方法数据源(MD5加密之前)进行处理。程序首先获取到用户输入的一段数据,然后再用户数据的某个位置(比在末尾加理论上安全性更高一点点)插入一段随机数(比固定的盐安全性高一点点),然后再进行MD5处理,将处理后的数据和盐都保存到数据库中,在数据校验的时候,同样的思路进行校验一下就可以了。

4 总结

    没有任何一种加密算法是不可被破解的,现在已经有很多人在专门研究MD5的解密工作,山东大学王小云教授等已经发现新的方法,可以大大提高破解的速度(并不是说一个x y z一套公式就可以,本质应该还是暴力破解 只是提高了速度),http://www.md5crk.com/  称:使用他们的技术,在数个小时内就可以找到MD5碰撞(附上报导:https://blog.csdn.net/tanaya/article/details/96849)。也就是说,只要知道MD5值是多少,只要我给你一个数,同样能够计算出一样的MD5值就可以,根本不用考虑你的原始数据是什么(只看结果,不论原始数据)。

   最后一句,MD5是散列算法,并不是加密算法。当然,这句话本来就有争论,甚至使用MD5来进行数据加密这句话 也有可能是错误的,但是现实是,很多网站 都是使用MD5来对一些敏感数据进行加密,比如前段时间爆出的A站问题

  

你可能感兴趣的:(算法)