消息摘要(Message Digest)
消息摘要
最开始本来是想写一篇关于信息去重的文章,想把这些去重方案归集一下,但是因为最近很忙,所以来不及去写相关的笔记,正巧又在看hash函数和信息摘要的文章,所以就勉强写了这篇笔记。
一、基础概念
消息摘要(数字摘要)是密码学中用于验证数据完整性和真实性的核心技术。通过哈希函数(如MD5、SHA系列)将任意长度的输入转换为固定长度的唯一字符串,又称hash值,单向hash函数用于产生消息摘要,具有不可逆性,无法通过摘要反推原始数据。
hash函数主要解决一下问题:
1、在一特定的时间内,无法查找经hash函数操作后生成特定hash值的原报文信息。也无法查找两个经hash操作后生成相同hash值的不同报文。
2、在数字签名中可以解决验证签名和用户身份验证、不可抵赖性的问题。
特点:
消息摘要简要地描述了一份较长的信息或文件,它可以被看作一份长文件的“数字指纹”。
对于特定的信息或者是文件而言,计算出来的消息摘要的长度总是固定且唯一的。(如MD5为128位,SHA-256为256位)
不同输入必然产生不同摘要,相同输入始终生成相同结果,且极难找到两个不同输入生成相同摘要。
消息摘要是单向的和不可逆的,无法通过摘要逆向推导原始数据。
二、常见算法及演进
1、MD5(Message-Digest Algorithm 5)是一种广泛使用的加密散列函数,可以将任意长度的数据转化为一个128位的哈希值。
2、SHA(Secure Hash Algorithm)系列包括SHA-1、SHA-256、SHA-3等。
算法 | 输出长度 | 安全性现状 | 典型应用场景 |
---|---|---|---|
MD5 | 128位 | 已不安全(易碰撞) | 遗留系统校验 |
SHA-1 | 160位 | 被破解(理论层面) | 逐步淘汰中 |
SHA-256 | 256位 | 当前安全 | 区块链、数字证书 |
SHA-3 | 可变长 | 新一代安全标准 | 高安全需求领域 |
注意:hash算法得出的结果本质上是一串数值,如MD5的128位是指二进制的长度,16进制的长度是32位。
在选择哈希算法时,需结合安全性、性能、用途及标准化等多维度评估。
三、核心应用场景
1、数据完整性验证
通过对比传输前后数据的摘要值,判断是否被篡改(如文件下载校验、数据库备份验证)。
2、数字签名
对消息摘要进行加密形成签名,接收方解密后比对摘要验证身份和内容真实性(如SSL/TLS证书)。
数字签名主要一下几个步骤:
(1)、信息发送者使用一个单向散列函数(Hash 函数)对信息生成信息摘要
(2)、信息发送者使用自己的私钥签名信息摘要。
(3)、信息发送者把信息本身和已签名的信息摘要一起发送出去。
(4)、信息接收者通过使用与信息发送者使用的同一个单向散列函数(Hash 函数)对接收的信息本身生成新的信息摘要,再使用信息发送者的公钥对信息摘要进行验证,以确认信息发送者的身份和信息是否被修改过。
数字加密主要经过以下几个过程:
(1)、当信息发送者需要发送信息时,首先生成一个对称密钥,用该对称密钥加密要发送的报文。
(2)、信息发送者用信息接收者的公钥加密上述对称密钥。
(3)、信息发送者将第(1)步和第(2)步的结果结合在一起传给信息接收者,称为数字信封。
(4)、信息接收者使用自己的私钥解密被加密的对称密钥,再用此对称密钥解密被发送方加密的密文,得到真正的原文。
数字签名和数字加密的过程虽然都使用公开密钥体系,但实现的过程正好相反,使用的密钥对也不同。数字签名使用的是发送方的密钥对,发送方用自己的私有密钥进行加密,接收方用发送方的公开密钥进行解密,这是一个一对多的关系,任何拥有发送方公开密钥的人都可以验证数字签名的正确性。数字加密则使用的是接收方的密钥对,这是多对一的关系,任何知道接收方公开密钥的人都可以向接收方发送加密信息,只有唯一拥有接收方私有密钥的人才能对信息解密。另外,数字签名只采用了非对称密钥加密算法,它能保证发送信息的完整性、身份认证和不可否认性;而数字加密采用了对称密钥加密算法和非对称密钥加密算法相结合的方法,它能保证发送信息的保密性。
3、密码安全存储
存储用户密码的摘要而非明文,即使数据库泄露也无法直接获取原始密码。可以防止用户信息被非法盗取。
4、快速数据比对
利用摘要固定长度特性,快速判断大规模数据集是否重复(如云存储去重)。也可以使用在爬虫领域,对全站的爬取时可以对请求的URL链接进行去重。利用信息摘要算法可以大幅度降低去重容器的存储空间使用率,并提高判断速度。由于其强唯一性的特点,几乎不存在误判。
大量文本数据如新闻,文章等时,可以使用相似文本去重。
四、案例
案例通过Python代码去生成信息摘要。
1、通过MD5函数去生成指定文本的消息摘要
1 | from hashlib import md5 |
通过结果可以看出是一个32位的16进制信息。由于一位16进制可以转化为4位2进制。所以32*4=128位二进制数据。
2、通过sha3_256函数去生成SHA-256的信息摘要
1 | from hashlib import sha3_256 |
同样的会得到64位的16进制数。64*4=256位。