算法系列:5分钟了解哈希算法


前言

哈希算法是现代密码体系中的一个重要组成部分。大家比较感兴趣的数字货币,就使用了哈希算法。


哈希算法简介

哈希(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;

}


总结

哈希算法有很多,计算过程也比较复杂,但是大多数情况下,我们不用自己写代码实现这些算法,只需要调用相关算法库中的方法即可。



更多精彩内容