消息摘要算法的主要特点有:
1、无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出,SHA-1的变体可以产生192比特位和256比特位的消息摘要。一般认为,摘要的最终输出越长,该摘要算法就越安全。变长输入,定长输出。
2、只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。这正是好的消息摘要算法所具有的性质:输入改变了,输出也就改变了;两条相似的消息的摘要确不相近,甚至会大相径庭。从理论上来说,不管使用什么样的摘要算法,必然存在2个不同的消息,对应同样的摘要。因为输入是一个无穷集合,而输出是一个有限集合,所以从数学上来说,必然存在多对一的关系。但是实际上,很难或者说根本不可能人为的造出具有同样摘要的2个不同消息。所以我们选择摘要算法的时候,要注意其安全性。比如现在MD5就是不安全的,已经被国内王小云破解。
3、消息摘要是单向、不可逆的。只能进行正向的信息摘要,而无法从摘要中恢复出任何的原始消息,甚至根本就找不到任何与原信息相关的信息。当然,可以采用强力攻击的方法,即尝试每一个可能的信息,计算其摘要,看看是否与已有的摘要相同,如果这样做,最终肯定会恢复出摘要的消息。但实际上,要得到的信息可能是无穷个消息之一,所以这种强力攻击几乎是无效的。
4、好的摘要算法,没有人能从中找到“碰撞”,虽然“碰撞”是肯定存在的。即无法找到两条不同消息,但是它们的摘要相同。
JDK自带了很多常见的消息摘要算法,使用方式如下:
import java.security.MessageDigest; import java.security.Security; import java.util.Set; import javax.xml.bind.DatatypeConverter; public class Test { public static void main(String[] args) throws Exception { String originalContent = "123456"; Set<String> availableAlgorithms = Security.getAlgorithms("MessageDigest"); for (String each : availableAlgorithms) { digest(each, originalContent.getBytes()); } } private static void digest(String algorithm, byte[] content) throws Exception { MessageDigest instance = MessageDigest.getInstance(algorithm); instance.update(content); //当所有数据已被更新,调用digest()方法完成哈希计算,返回字节数组 byte[] digest = instance.digest(); System.out.println("算法=" + algorithm + ",摘要=" + DatatypeConverter.printHexBinary(digest)); } }
消息摘要有什么用呢?消息摘要保证了消息的完整性。如果发送者发送的消息,在传输过程中被恶意篡改,那么接收者收到消息后,用同样的摘要算法计算其摘要,如果新摘要与发送者原始摘要不同,那么接收者就知道消息被篡改了。这里有一个前提条件就是:接收者一定要事先知道消息的原始摘要。消息摘要不需要秘钥,不存在秘钥的保管和分发问题。
编解码算法
1. Hex 编码
将二进制数据按16进制转换为字符串,1字节=2个字符,编码后体积为2倍。
2. Base64
由MIME规范定义的编码算法,其将3个字节(24位)编码为4个字符。
字符集包括64个,可表示6二进制位的数据,因此一个字符对应一组6bit的数据。
编码后体积约为4/3倍,针对不足位数用=补齐。
HASH 算法
通常也称散列算法,是一种将任意长度的消息变成固定长度的消息摘要算法,不可逆;
1 MD5
Message Digest Algorithm 5,流行度极高,但目前被发现存在碰撞冲突风险;
任意长度输出为128bit=16字节摘要
2 SHA1
SHA 指Security Hash Algorithm,由美国国家安全局NSA设计的安全散列算法系列;
SHA1 输出长度为160bit=20字节摘要
3 SHA256
继SHA1 出现的算法(属于SHA-2类),安全性较SHA1更高;
SHA256 输出长度为256bit=32字节摘要。
MAC 算法
Message Authentication Code,消息认证码算法,基于HASH算法之上,增加了密钥的支持以提高安全性。
具体算法包括HmacMD5/HmacSHA1/HmacSHA256等,输入包括数据及密钥,输出长度与HASH算法一致。
密钥可以是任意长度的数据。
网友评论