简介
消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,即单向加密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。
消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络上使用。由于其加密计算的工作量相当巨大,所以以前的这种算法通常只用于数据量有限的情况下的加密,例如计算机的口令就是用不可逆加密算法加密的
用途
一般地,把对一个信息的摘要称为该消息的指纹或数字签名,数字签名是保证信息的完整性和不可否认性的方法。消息摘要算法适合作为数字签名算法,也是数字签名的核心算法。
分类
MD(Message Digest,消息摘要)
SHA(Secure Hash Algorithm,安全散列算法)
MAC(Message Authentication Code,消息认证码)
……
MD
MD算法包括MD2、MD4和MD5,摘要长度都是128位,都是单向加密,其中JDK自带MD2和MD5。
MD5的 java 实现
public class MyMD5 {
public static void main(String[] args) {
String str = "i am guo feng";
try {
//获取MD5算法实例
MessageDigest md = MessageDigest.getInstance("MD5");
//传入需要计算的字符串更新摘要信息
md.update(str.getBytes());
//获得摘要
//BigInteger函数则将8位的字符串转换成16位hex值,
//用字符串形式表示hash值。
String result = new BigInteger(1, md.digest()).toString(16);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
输出:
364620d83dfd1e22936d6e9792068b67
- 1
MD5 的应用场景
经典的使用时序图如下:
系统用户注册:
系统用户登录:
当数据库受到攻击时,泄漏的密码是MD5加密的,对用户和公司也没有什么损失。
SHA
安全散列算法包括SHA-1,SHA-2,其中SHA-2是SHA-224、SHA-256、SHA-384、SHA-512的统称。
安全散列算法同MD一样,也是固定长度摘要。SHA-1的摘要长度是160,SHA-2的摘要长度是每个名称的后面标识数字。
SHA-1的java实现:
public class MySHA {
public static void main(String[] args) {
String str = "i am guo feng";
try {
//获取算法实例
MessageDigest md = MessageDigest.getInstance("SHA");
//传入需要计算的字符串更新摘要信息
md.update(str.getBytes());
//获得摘要
//BigInteger函数则将8位的字符串转换成16位hex值,用字符串形式表示hash值。
String result = new BigInteger(1, md.digest()).toString(16);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
输出:
f23bf780967813dd28e3af23a8960821db415791
- 1
SHA 的应用场景
最容易看得到的是,打开计算机浏览器的管理证书,例如我的360极速浏览器的证书,点开一个证书,可以看到指纹算法 sha1 和指纹:
经典的使用时序图如下:
消息鉴别是指:在接收方将原始消息使用公布的摘要算法进行摘要,然后把摘要结果和接收的摘要消息进行比对,从而进行处理。
大部分发送方以“原始消息+Key+时间戳”的类似格式进行摘要处理,然后发送。