最近在做练手的小项目,做工具类的时候,首先就写了使用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 实现
/// <summary>
/// 字符串转换为MD5 this扩展方法 对应类应该为静态类
/// </summary>
/// <param name="str">待转化字符</param>
/// <returns></returns>
public static string CalcMD5(this string str)
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(str);
return CalcMD5(bytes);
}
/// <summary>
/// 数组转换为MD5
/// </summary>
/// <param name="bytes">数组</param>
/// <returns></returns>
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;
}
}
/// <summary>
/// 流转为MD5
/// </summary>
/// <param name="stream">流</param>
/// <returns></returns>
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一套公式就可以,本质应该还是暴力破解 只是提高了速度),Medical products and supplies - Medical Products 称:使用他们的技术,在数个小时内就可以找到MD5碰撞(附上报导:密码学领域重大发现:山东大学王小云教授成功破解MD5_唐古拉山的专栏-CSDN博客)。也就是说,只要知道MD5值是多少,只要我给你一个数,同样能够计算出一样的MD5值就可以,根本不用考虑你的原始数据是什么(只看结果,不论原始数据)。
最后一句,MD5是散列算法,并不是加密算法。当然,这句话本来就有争论,甚至使用MD5来进行数据加密这句话 也有可能是错误的,但是现实是,很多网站 都是使用MD5来对一些敏感数据进行加密,比如前段时间爆出的A站问题