前言:
首先的明白消息认证是干什么用的,消息认证是为了验证接收到的消息是否被修改且是信任一防发送过来的。可以防止有人进行主动攻击修改数据内容,而接收方不知道的情况。
1、消息加密认证
其主要就是为了验证消息是否被被修改,那怎么验证呢?常用的方法是使用消息认证码(MAC)。将消息(msg)进行摘要处理得到结果MAC=C_{K1}(msg)
。然后和明文(M)拼接到一起,在加密函数 E 和秘钥 K2 进的作用下得到加密结果C=E_{K2}(msg+mac)
,发送给对方。
对方收到密文 C 后,先使用解密函数 D 和秘钥 K1 进行解密得到明文MAC+M=D_{K2}(C)
,然后使用摘要算法函数和秘钥 K1 对明文 M 进行加密得到结果 MAC2=C_{K1}(M)
,若MAC2=MAC
则说明消息正常,是受信任的一方发送来的,如果不相等就舍弃这个结果。
2、Hash 函数
又称为散列函数,其强大之处在于能够把不定长的数据转成定长字符串,Hash函数单向函数,结果不可逆转。公式h=H(M)
,hash 值 h 一般是128位或者160位。
哈希函数主要配合数字签名里面做消息的摘要提取。
2.1 MD5
MD5现在最大的用处就在于检测文件有没有被修改,比如你想给别人发送一个压缩包,此时你可以生成该压缩包文件的 MD5 值,一并发送给对方。对方接受到文件后也生成 MD5 值,并与发过来的 MD5 做对比,一致则没问题。
import hashlib name = "我爱信息安全" name_md5 = hashlib.md5(name.encode('utf8')).hexdigest() print(f"原文:{name}\nMD5:{name_md5}") # 原文:我爱信息安全 # MD5:f88750f47f532a82055d741060a993e2
MD5应用例子:
MD5还可用于 CDN 内容防盗链问题,假设一个场景,你有一个做科普知识类的视频网站,其视频内容存放在某云上,最近发现有人盗用你的网站的视频链接,造成了很大的经济损失。那么接下来你会怎么补救?
常见的是防盗链方法有:Referer值、Cookie、IP、Header等,但是这些都可伪造,不是很安全。那么可以使用Token验证的方式,验证链接的有效性,具体做法如下:
例如,一个链接为:/test/p/java.image?token=0,秘钥为:secret,设secret="java"
- 设置链接过期时间为60分钟,expire_time = now_time + 3600,格式是时间戳类型。expire_time=1620814643+3600=1620818243
- 计算MD5值,tok = MD5(url_path+expire_time+secret)。tok = MD5("/test/p/java.image"+1620818243+"java")=ef9a78bf0fa14e20304a5fce49342f3c
- 最终结果:tok = tok[中间6位]+expire_time,tok=e20304+1620818243=e203041620818243
- 最终的url为:
/test/p/java.image?token=e203041620818243
用户请求这个 url 时,CDN 平台方会拿到过期时间1620818243
,然后做相同的MD5计算,看是否与token
的值相同,若相同可验证过期时间是否逾期。
总结
消息认证主要是为了验证消息的机密性,还是很重要的。
参考文章: