前言
哈希算法是现代密码体系中的一个重要组成部分。大家比较感兴趣的数字货币,就使用了哈希算法。
哈希算法简介
哈希(hash)算法又称为散列算法,通过hash算法,可以将任意长度的信息转换成一个固定长度的二进制数据,我们经常会使用十六进制值来表示转换后的信息。
比如,数字123,使用md5的hash算法后,得到十六进制的值:202cb962ac59075b964b07152d234b70
哈希算法的特点:
(1)不同的信息,理论上得到的hash值不同,我们称之为“无碰撞”,或者发生“碰撞”的概率非常小。
(2)不可逆,hash算法是单向的,从hash值反向推导出原始信息是很困难的。所以,有些系统中,我们可以使用hash算法对密码进行处理后保存。
hash算法的主要应用:
(1) 数据完整性校验
我们可以将原始数据和经过哈希算法得到数据一块发送给对方,对方收到数据之后,对数据使用相同的哈希算法进行计算,如果得到的哈希值和对方发过来的相同,那么就说明数据没有经过篡改。
(2) 数字签名
一般我们先对原始数据进行hash处理,然后对处理后的数据使用私钥进行加密。将原始数据和加密后数据发送给接收方。接收方使用公钥解密,然后对数据进行hash处理,后对比,借此实现用户身份的验证。
常见哈希算法
1 MD5
MD5在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128bit位散列值。
2 SHA-1
SHA(Secure Hash Algorithm)安全散列算法是一个密码散列家族,由美国国家安全局(NSA)所设计,也是一种哈希算法。
SHA-1 算法输入以512位数据块为单位处理,产生160比特的消息摘要作为输出。
3 代码
如果我们想使用相关hash算法进行处理,一般不需要自己进行实现,只需要调用java或者第三方提供的代码即可。比如,如果想根据md5算法得到一个字符串的的hash值,代码如下:
public static String md5(String plainText) {
//定义一个字节数组
byte[] secretBytes = null;
try {
// 生成一个MD5计算摘要的对象
MessageDigest md = MessageDigest.getInstance("MD5");
//对字符串进行hash处理
md.update(plainText.getBytes());
//获得hash运算后数据
secretBytes = md.digest();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("没有md5这个算法!");
}
//将hash后的数据转换为16进制数字
String md5code = new BigInteger(1, secretBytes).toString(16);// 16进制数字
// 如果生成数字未满32位,需要前面补0
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
总结
哈希算法有很多,计算过程也比较复杂,但是大多数情况下,我们不用自己写代码实现这些算法,只需要调用相关算法库中的方法即可。