美文网首页
消息摘要算法

消息摘要算法

作者: 柳岸花开 | 来源:发表于2017-06-16 14:07 被阅读646次

    消息摘要算法的主要特点有:

    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算法一致。 
    密钥可以是任意长度的数据。

    相关文章

      网友评论

          本文标题:消息摘要算法

          本文链接:https://www.haomeiwen.com/subject/ndxmqxtx.html