消息认证码
- 什么是消息认证码
- 消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,简称MAC;也可以理解为与密钥相关联的单向散列函数。消息认证码和单项散列函数具有同样的性质,可以输入包括任意长度的消息,它就能输出固定长度的数据,这个数据就称为MAC值。
- 消息认证码和单项散列函数不同的是, 消息认证码的输入是信息+通信双方的共享验证码。其中共享密钥是完成认证工作;输入不同输出不同的性质是完成确定完整性工作,也就是确认消息是否被篡改。
- 单向散列函数与消息认证码在作用上也有区别:前者是确定消息是否被篡改,后者识别消息是否被伪装。
- 消息认证码的使用步骤
1.Alice与Bob事先共享密钥
2.Alice根据汇款请求信息计算MAC值(使用共享密码)
3.Alice将汇款请求消息和MAC值两者发送给接收者Bob
4.Bob根据接收到的汇款请求消息计算MAC值(使用共享密钥)
5.Bob将自己计算的MAC值与从Alice处收到的MAC值进行对比
6.如果两个MAC值一致,则Bob就可以断定汇款请求的确来自Alice(认证成功);如果不一致则说明不是来自Alice(认证失败)
- 消息认证码的密钥配送问题
在消息认证码中,共享密钥起着重要作用,一旦被攻击者窃取,消息认证码的作用就失效了。实际上,对成密码的密钥配送问题在消息认证码中也同样会发生。因此,也可以采取同样的解决方案,通过公钥密码、Diffie-Hellman密钥交换、密钥分配中心等方式来解决配送问题。 - 消息认证码的实例
- SWIFT
SWIFT的全称是society for Worldwide Interbank Financial Telecommunication(环球银行金融电信协会),用于国际银行间的交易保驾护航。而银行间的通信就是使用的消息认证码,消息认证码使用的共享密钥则是由人来进行配送的 - IPsec
IPsec是对互联网基本通信协议-IP协议增加安全性的一种方式。在IPsec中,对通信内容的认证和完整性校验都是采用消息消息认证码来完成的。 - SSL/TLS
SSL/TLS对通信内容的认证和完整性校验也使用了消息认证码。
- 消息认证码的实现方法
1、SHA-2之类的单项散列函数,也称为HAMC
2、AES之类的分组密码
3、流密码
4、公钥密码 - 认证加密
认证加密是一种将对称密码与消息认证码相结合,同时满足机密性、完整性和认证三大功能的机制。
Encrypt-then-MAC认证加密方式:先用对称密码将明文加密,然后计算密文的MAC值,通过MAC值就能判断明文的和密钥是否人为生成的,这可以避免发送任意伪造密文,让服务器解谜来套取信息的攻击。
GCM认证加密方式:GCM中使用AES等128比特分组密码的CTR模式,并使用一个反复进行加法和乘法运算的散列函数来计算MAC值。由于CTR模式的本质是对递增的计算器值进行加密,因此可通过对若干分组进行并行处理来提高速度,CTR模式加密与MAC值的计算使用的是相同的密钥,因此管理也会更容易。专门用于消息认证码的GCM称为GMAC。 - HMAC
HMAC是一种使用单项散列函数来构造消息认证码的方法,其中受用的单向散列函数也并不仅限于一种。
HMAC的步骤:
(1)密钥填充:
如果密钥比单行散列函数的分组要短,就需要在末尾填充0,直到其长度达到单项散列函数的分组长度为止;如果超过长度,则使用单项散列函数求出密钥的散列值,将这个散列只用作HMAC的密钥
(2)填充后的密钥与ipad的XOR
将填充后的密钥与被称为ipad的比特序列进行XOR运算。ipad是将00110110这一比特序列不断循环往复直到达到分组长度所形成的比特序列。XOR运算所得到的值就是一个和单项散列函数的分组长度相同,且和密钥相关的比特序列,暂称为ipadkey。
(3)与消息组合
将ipadket附加在消息的开头
(4)计算散列值
(5)填充后的密钥与opad的XOR
将填充后的密钥与被称为opad的比特序列进行XOR运算。opad是将01011100这一比特序列不断循环往复直到达到分组长度所形成的比特序列。XOR运算所得到的值就是一个和单项散列函数的分组长度相同,且和密钥相关的比特序列,暂称为opadkey。
(6)与散列值组合
(7)计算散列值
最后得到的MAC值,一定是一个和输入的消息以及密钥都相关的长度固定的比特序列。 - 对消息认证码的攻击
1、重放攻击:保存正确的MAC值不断重放来进行攻击,一次MAC使用多次交易,将导致巨额损失
防御措施:
序号:约定每次都对发送的消息赋予一个递增的编号,并且在计算MAC值时将序号也包含在消息中,这样攻击者因为无法计算出正确的MAC值将攻击失效。但是对每个通信对象都需要记录最后一个消息的序号。
时间戳:约定在发送消息时包含当前的时间,如果收到以前的消息,即便MAC值正确也将其当作错误的消息来处理,这样就能够防御重放攻击。但是这要求发送者和接收者时间必须一致,否则会有延迟,留下重放攻击的空间
nonce:通信前,接收者现象发送者发送一个一次性的随机数也就是nonce,将这个nonce包含在信息中并计算MAC值,因为每次都会发生变化,则避免了重放攻击,但是通信的数据量会增加。
2、密钥推测攻击:因为消息认证码和单项散列函数类似,因此暴力破解和生日攻击同样有效
对于消息认证码而言,应保证不能根据MAC值推测出通信双方使用的密钥;以及在生成消息认证码所使用的密钥时,必须使用密码学安全的、高强度的伪随机数生成器。 - 消息认证码无法解决的问题
1、第三方证明
因为使用的共享密钥,所以只有通信双方能证明是对方计算的MAC值,而无法向第三方证明是对方或自己计算的MAC值
2、防止否认
双方使用共享密钥,可能会出现否认情况,又因为无法向第三方证明,因此使用消息认证码这完全取决于双方的信任程度。
数字签名
- 从消息认证码到数字签名
消息认证码的局限性:因为使用了共享密钥的缘故,消息认证码无法防止否认。
数字签名解决问题:Alice和Bob各自使用不同的密钥,只有本人知道的密钥,也就是数字签名 - 签名的生成和验证
生成消息签名:由消息发送者对消息进行签名,也就是使用密钥对消息生成MAC值。整个过程可以理解为“我认可该消息的内容”
验证数字签名:验证可以由消息接收方或者第三方完成,验证结果成功则代表签名确实属于发送者,失败则意味不属于发送者。
数字签名对签名密钥和验证密钥进行了区分,使用验证密钥是无法生成签名的。签名密钥只能由签名的人持有,而验证密钥则是任何需要验证签名的人都可以持有。从这里来看和公钥密码的原理很类似,实际上,数字签名就是通过将公钥密码“反过来用”实现的。他们的关系如下:
- 公钥密码与数字签名
公钥密码包括一个由公钥和私钥组成的密钥对,公钥用于加密,私钥用于解密
数字签名中也同样会使用公钥和私钥组成的密钥对,不过这两个密钥的用法和公钥密码是相反的,即用私钥加密相当于生成签名,而用公钥解密相当于验证签名。
用公钥加密所得到的密文,只能用与该公钥配对的私钥才能解密;同样地,用私钥加密所得到的密文,也只能与该私钥配对的公钥才能解密。用私钥进行加密这一行为只能由持有私钥的人完成,正是基于这一事实才能够将私钥加密的密文作为签名来对待。
由于公钥是对外公开的,因此任何人都能够用公钥进行解密,于是任何人都能够对签名进行验证。
- 数字签名的方法
直接对消息签名的方法:1)发送者用自己的私钥对消息进行加密 2)发送者将消息和签名发送给Bob 3)接收者用发送者的公钥对收到的签名进行解密 4)接收者将签名解密后得到的消息与接收者直接发送的消息进行对比
对消息的散列值签名的方法:1)发送者用单项散列函数计算消息的散列值 2)发送者用自己的私钥对散列值进行加密 3)发送者将消息和签名发送给接收者 4)接收者将签名解密后得到的散列值与发送者直接发送的消息的散列值进行对比
在实际使用场景中,人们更倾向于第二种方法。 - 关于数字签名的部分问题解答
- 密文为什么能作为签名使用
因为数字签名被用于代表一种只有持有该密钥的人才能够生成的消息,这里的信息一般称为认证符号。消息认证码也是认证符号的一种,数字签名也是一样。数字签名是通过使用私钥进行加密来产生认证符号的 - 数字签名能否保证机密性
不能,因为数字签名的作用本来就不是保证机密性,如果需要保证机密性,则可以不发送明文消息,而是将消息进行加密后再发送 - 签名能否随意复制
可以,虽然称为签名,但实际上也只是一串数据,数据签名可以附加在消息的末尾,也可以和消息分离单独发送。因此可以直接复制,但是特定的签名者与特定的消息是绑定在一起的,因此无论如何复制,最后结果得到的信息也是原始绑定的。 - 消息内容能否任意修改
数字签名所要实现的并不是防止修改,而是识别修改。修改没问题,但验证签名会失败 - 签名能否重复使用
不能,将签名部分提取出来并附在其他消息后面,这样操作会导致验证失败。消息内容和签名是对应的,因此直接的拓印签名是无效的 - 删除签名会使消息作废吗
不能,带有数字签名的消息即使删掉也无法作废,要作废带数字签名的消息需要创建一份新的消息,并附上数字签名 - 如何防否认
防否认和“谁持有密钥”两者密切相关,在消息验证码中,双方使用的是同一个密钥,双方都可以称这是对方生成的,进行否认。而数字签名使用的是不同的密钥,则无法进行否认。但如果提到说密钥被盗,则通过证书解决该问题。 - 数字签名能否真的能够替代签名
虽然相较于传统签名,数字签名有很多优点。但是还未形成共识,还有发展空间,还不能完全取代传统签名。
- 密文为什么能作为签名使用
- 对数字签名的攻击
- 中间人攻击:攻击者对发送者伪装成接收者,对接收者伪装成发送者,这样可以在完全不用破解数字签名的前提下完成攻击。防御措施是:通信双方事先沟通确定双方的地址正确。
- 对单向散列函数的攻击:数字签名中所使用的单项散列函数必须具有强抗碰撞性,否则会生出另外一条不同的消息,使其与签名所绑定的消息具有相同的散列值。
- 利用数字签名攻击公钥密码:通过社会工程学,让使用者在不知情的情况下对未知消息进行签名。防御措施是:不对陌生和意思不清晰的消息进行签名
- 潜在伪造:签名的对象是无意义的消息(例如随机比特序列),如果攻击者能够生成合法的数字签名(即攻击者生成的签名能够正常通过校验),这称之为潜在威胁。防御措施是:在改良RSA的基础上开发了一种签名算法,叫作RSA-PSS,它并不是对消息本身进行签名,而是对其散列值进行签名。同时为了提高安全性,在计算散列值的时候还要对消息加盐。
- 其他攻击:对公钥密码的攻击大部分也适用于数字签名。
- 数字签名无法解决的问题
要正确使用数字签名,有一个重要前提是,用于签名的公钥必须属于真正的发送者。因此为了确认得到的公钥是否合法,需要使用证书。
证书
公钥证书类似于驾照等,由认证机构(AC)对其进行数字签名,只要看到公钥证书,就可以确认该公钥确实是其本人。公钥证书也简称为证书。
- 证书的在通信流程中:
(1)Bob生成密钥对
(2)Bob在认证机构Trent注册自己的公司
(3)认证机构Trent用自己的私钥对BOb的公钥施加数字签名并生成证书
(4)Alice得到带有认证机构Trent的数字签名的Bob的公钥(证书)
(5)Alice得到带有认证机构Trent的数字签名,确认Bob的公钥的合法性
(6)Alice用Bob的公钥加密消息并发送给Bob
(7)Bob用自己的私钥解密密文得到Alice的消息
- 公钥基础设施(PKI)
公钥基础设施是为了能够更有效地运用公钥而制定的一系列规范和规格的总称。其中PKI的组成要素分为:用户(使用KPI的人)、认证机构(颁发证书的实体)、仓库(保存证书的数据库) - 对证书的攻击
证书就是用的数字签名技术,因此对数字签名的攻击适用于证书
1、在公钥注册之前进行攻击。在认证机构和Bob完成认证前,更改认证的公钥
2、注册相似人名攻击。更改用户信息的大小写或创建前面和后面的数字相同的公钥,利用人的惯性思维
3、窃取认证机构的私钥进行攻击。窃取认证机构的私钥,这就要求认证机构在私钥丢失的第一时间通知用户
4、伪装成认证机构进行攻击。如果认证机构本身不可信,即便证书合约,其中的公钥也不能使用
5、钻CRL的空子进行攻击。从公钥失效到接受者收到证书作废清单(CRL)需要一段时间,主动攻击者可以利用CRL发布的时间差来发动攻击。这就要求公钥失效时要尽快通知认证机构,及时发布和更新CRL
6、另一种钻CRL的空子进行攻击。交易的一方以私钥被盗为由,否认交易。这是需要外部能力的介入,或采用OCSP的协议 - 关于证书的部分问题解答
- 为什么需要证书
如果是从认证机构获取公钥,就可以降低遭到中间人攻击的风险。如果能够取得可信的公钥,则不需要认证机构;当持有可信的认证机构,并相信认证机构所进行的身份确认的情况下,则可以信任该认证机构颁发的证书以及通过该途径取得的公钥。 - 能否通过自己的方式认证更安全
这犯了典型的隐蔽式安全错误,公开的认证方式都是经过专家以及专业技术人员认证的,自己的方式最后都会造成严重的后果。 - 认证机构是否可信
认证机构有层级区分的,层级结构作为参考辅助,信任更多是基于该机构多个可信的情报源所作出的判断。
- 为什么需要证书