消息认证码
消息认证码(Message authentication code,MAC)
百度百科上给的定义是:经过特定算法后产生的一小段信息,用来检查某段消息的完整性,以及作身份验证。
它给我的第一感觉就是对称密码。(对称加密:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密)因为MAC值都是使用相同的密钥生成和验证的。
总的来说它的原理就是对称密码,精髓的一点就是它多定义了个MAC值,这个MAC值会在明文本身就是乱码消息时鉴别出是否是对方真正发出的消息,而对称密码解密后发现是无意义的乱码就无法确定是否为所需消息。
(有点绕哈,我再说得明白一点,就比如说你发了一大段火星文给你的朋友,你的朋友看不懂,但MAC就会告诉他,这确实是你发的原文,而对称密码则会让他困扰,究竟是被人篡改了,还是打开方式不对?)
通俗地讲,消息认证码就是利用了对称密码使发送者和接受者都破解得到同一个值(其中算出MAC值的过程类似于加密的过程),而不是直接破解出明文,利用对比MAC值是否前后一致来进行认证,由于要发送MAC和密钥两个私密信息,它的保护需求更为强烈,中途被截获或篡改任意一个都会导致无法认证。
单向散列函数
单向散列函数与消息认证码比较而言,缺少的仅仅是与密钥的关联,它是由消息直接算出散列值。
单向散列函数这里我认为要着重注意的是两种抗碰撞性:
-
弱抗碰撞性(保证要找到和该条消息具有相同散列值的另外一条消息是非常困难的)
-
强抗碰撞性(保证找到散列值相同的两条不同消息是非常困难的)
注意两者之间的不同,弱抗碰撞性相当于找男/女朋友,一个人要找到另外一个和自己灵魂相契合的人是很难的。而强抗碰撞性则有点像生双胞胎,正常情况下双胞胎是很少见的。(比喻恰不恰当大家自己体会一下,明白意思就行了,当然有更好的比喻希望各路大神评论区见)
利用单向散列函数的实例非常多(如数字签名和伪随机数生成器),所以找到高强度的单向散列函数是非常关键的。
对单向散列函数的攻击目前主要是暴力破解(攻击弱抗碰撞性)和生日破解(攻击强抗碰撞性),单向散列函数本身是无法认证的,它只能检验出是否消息完整,而由它衍生出的消息认证码和数字签名才是认证的主角。