【Cryptography】数据完整性
Hash函数
概念:输入任意长度的数据块,产生固定长度的Hash值
目的:保证数据完整性,只要修改消息内容的任一位(bit),产生的Hash值会有天壤地别的变化
Hash函数不是某个特定函数,它指一类函数
最简单的Hash函数:mod(),比如任意数据 mod 2 得到固定长度的0或1
满足的条件
Hash函数要满足以下两个条件:
- 单向性:计算一个给定消息串的
hash值
是容易的, 但是根据hash值
找到对应的消息是困难的 - 抗碰撞性:两个不同的消息,但具有相同的
hash值
是困难的
Hash值应用
如:消息验证、数字签名等
消息验证
保证收到的数据确实和发送时的一样,没有经过修改、播放、删除或重放等
步骤
-
发送者在发送消息时,需要计算出消息对应的Hash值,并一起发送过去
-
接收者收到消息后,先对消息进行Hash计算,并对收到的Hash进行比较,判断是否相同。如果不匹配则可能受到了篡改
注意:
- 上面存在的前提是:这个
Hash本身没被篡改
- 就像中间人攻击,如果【中间人】Marrlory将消息篡改的同时,将篡改后的消息产生
新Hash
也修改并发送给【接收方】Bob,【接收方】Bob则无法发现这有问题
- 所以,对Hash本身也需要加密保护(如Alice拿Bob的公钥对hash进行加密,Bob再用自己私钥对hash解密,但这样还是可能被中间人攻击)
Hash与对称加密结合
通信双方使用共同的密钥
来加解密,并且,将密钥与消息一起作为输入,产生Hash值作为消息认证码
【Message authentication code】,
并将这个Mac与密文一齐发送
即使中间人拿到了密文,并对密文解密还篡改了,再将篡改后的密文产生新Hash,将新密文
和新Hash
发送【因为中间人不知道密钥,所以产生的hash肯定有问题】
接收方收到新密文
后,因为只有双方知道共同的密钥
,接收方重新计算密钥与新消息
Hash,发现与收到的新Hash
不匹配,说明发生了中间人攻击的篡改
注意:
- 这个前提是
双方共同的密钥没有泄露
数字签名
与上面的消息认证码相似
,在公钥使用的那篇文章提到过
- 如果只要认证,不要保密性。
- 只要发送方对消息或文件产生Hash码,并随着
密文
一起发送。接收方只要对消息计算Hash
并与接收的Hash
匹配即可
- 只要发送方对消息或文件产生Hash码,并随着
- 如果既要认证,也要保密性。【使用对称加密与数字结合】
- 发送方对消息或文件产生Hash码
- 发送方用自己的
私钥
对Hash码
加密得到Signature
【最好用接收方的公钥进行加密】 - 发送方再用
对称加密
中的密钥,将Hash码和消息
一起加密再发送。 - 接收方对接收的消息使用
对称加密密钥
解密 - 再用发送方的公钥对
Signature
进行解密得到Hash
- 再
对消息计算Hash
并与接收的Hash
进行匹配即可
- 如果既要认证,也要保密性。【使用
非
对称加密与数字结合】- 因为
非对称加密
往往进行密钥管理
,传输消息时不用非对称加密,如果要用也不是不行
- 因为
数字证书
这里是应用在数字签名
之上,用来保护数字签名不被中间人攻击替换,数字签名只能确保数据完整性
,消息内容本身的加密仍然可以用对称加密或非对称加密
最典型的应用HTTPS,这个S就是指TLS,TLS将对称加密
与数字证书
结合,在服务器与客户端连接阶段,用数字证书
来交换用来对称加密的密钥
,TCP建立后续都用这个对称加密的密钥来加密消息
,数字证书就没用了
服务器向CA申请数字证书时,服务器要把自己的公钥
也提交给CA,CA向服务器发送CA证书
和CA公钥
,CA已经将服务器自己的公钥
加密到CA证书
里面
客户端用CA公钥
从CA证书
提取出服务器的公钥
,再作其它传输操作【这样做的目标是,确定服务器的公钥
的确是来自服务器
的】
SSL/TLS协议运行机制的概述:https://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
MD5
最常用的Hash函数,输出128-bit哈希值
MD5(“The quick brown fox jumps over the lazy dog”) = 9e107d9d372bb6826bd81d3542a419d6
多一个点,对应的Hash就会不同
MD5(“The quick brown fox jumps over the lazy dog.
”) = e4d909c290d0fb1ca068ffaddf22cbd0
MD5缺点:撞库
,通过穷举的方式,对创建的明文密文进行查询
这个网站可以MD5反查:https://www.cmd5.com/
SHA
Secure Hash Algorithm
SHA其实是一个算法家族,由美国国家安全局(NSA)开发,有SHA1、SHA2、SHA3三类,目前SHA1已经被破解
,使用比较广泛的是SHA2类。
安全散列算法,即是将一段接收到的message通过哈希算法将其转换成固定位数的哈希值(也称消息摘要)。
SHA256就是将message通过哈希算法计算得到一个256位的哈希值。