赞
踩
1.什么是单向散列函数
单向散列函数有一个输入和一个输出,其中输入称为消息,输出称为散列值。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。
在指定的散列函数处理下,无论输入的字节序列尺寸如何,输出的尺寸是固定的。
应用:
1.对输入的字节序列1,采用单向散列函数计算出散列值。将散列值1保存到可信的安全位置。
2.之后某个时刻,再次对字节序列2输入,采用单向散列函数计算散列值2。
3.若散列值1等于散列值2,则可认为字节序列1和字节序列2是一致的。即每个字节都是相等的,且长度一致。
2.单向散列函数需具备的性质
_1.根据任意长度的消息计算出固定长度的散列值
_2.能够快速计算出散列值
_3.消息不同散列值也不同
弱抗碰撞性:要找到和该指定消息具有相同散列值的另外一条消息是非常困难的。
强抗碰撞性:要找到散列值相同的两条不同的消息是非常困难。
_4.具备单向性
即无法通过散列值反算出输入消息。
单向散列过程,有时也叫消息摘要过程。
3.常用的单向散列函数
_1.MD4、MD5
能够产生128比特的散列值。MD是消息摘要的缩写。
_2.SHA-1、SHA-256、SHA-384、SHA-512
_3.SHA-3
最新的标准
4.应该使用哪种单向散列函数呢
MD5是不安全的,因此不应该使用。
SHA-1除了用于对过去生成的散列值进行校验之外,不应该被用于新的用途,而是应该迁 移到 SHA-2。
SHA-2 有效应对了针对 SHA-1 的攻击方法,因此是安全的,可以使用。
SHA-3 是安全的,可以使用。
5.攻击
_1.原像攻击,第二原像攻击
原像攻击是指给定一个散列值,找出具有该散列值的任意消息;第二原像攻击是指给定一条消息1,找出另外一条消息2,消息2的散列值和消息1相同。
_2.生日攻击
生日攻击或者冲突攻击,这是一种试图破解单向散列函数的“强抗碰撞性”的攻击。找到散列值相同的两条消息,而散列值则可以是任意值。
6.总结
单向散列函数可以解决消息完整性(一致性)验证,但无法解决验证消息发送者是合法发送者。验证消息发送者是否合法,是认证的任务。
消息认证码,可以同时识别出篡改和伪装。
1.什么是消息认证码
消息认证码是一种确认完整性并进行认证的技术。
消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为MAC值。
消息认证码中则需要使用发送者与接收者之间共享的密钥。
2.消息认证码的实现方法
_1.使用单向散列函数实现
HMAC 是一种使用单向散列函数来构造消息认证码的方法。使用SHA-1 、SHA-224 、SHA-256 、SHA-384 、SHA-512 所构造的 HMAC, 分别称为 HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-256、HMAC-SHA-384、HMAC-SHA-512。
(1).密钥填充
如果密钥比单向散列函数的分组长度要短,就需要在末尾填充0,直到其长度达到单向散列函数的分组长度为止。
如果密钥比分组长度要长,则要用单向散列函数求出密钥的散列值,然后将这个散列值用作HMAC的密钥。
(2).填充后的密钥与ipad的XOR
将填充后的密钥与被称为ipad的比特序列进行XOR运算。ipad是将00110110这一比特序列(即16进制的36)不断循环反复直到达到分组长度所形成的比特序列,其中ipad的i是inner(内部)的意思。
XOR运算所得到的值,就是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里我们将这个比特序列称为ipadkey。
(3).与消息组合
随后,将ipadkey与消息进行组合,也就是将和密钥相关的比特序列(ipadkey)附加在消息的开头。
(4).计算散列值
将(3)的结果输入单向散列函数,并计算出散列值。
(5).填充后的密钥与opad的XOR
将填充后的密钥与被称为opad的比特序列进行XOR运算。opad是将01011100这一比特序列(即16进制的5C) 不断循环反复直到达到分组长度所形成的比特序列,其中opad 的o是outer(外部)的意思。
XOR运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里我们将这个比特序列称为opadkey。
(6).与散列值组合
将(4)的散列值拼在opadkey后面。
(7).计算散列值
将(6)的结果输入单向散列函数,并计算出散列值。这个散列值就是最终的MAC值。
通过上述流程我们可以看出,最后得到的MAC 值,一定是一个和输入的消息以及密钥都相关的长度固定的比特序列。
_2.使用分组密码实现
将分组密码的密钥作为消息认证码的共享密钥来使用,并用CBC模式将消息全部加密。
此时,初始化向量(IV)是固定的。由于消息认证码中不需要解密,因此将除最后一 个分组以外的密文部分全部丢弃,而将最后一个分组用作MAC 值。由于CBC模式的最后一个分组会受到整个消息以及密钥的双重影响,因此可以将它用作消息认证码。
3.攻击
_1.重放攻击
_1.1.攻击方法
中间人捕获消息及其MAC,多次发送同样内容给接收者。
_1.2.解决方案
(1).序号
消息中包含序号。这样接收者收到多个序号一致消息时,只处理一次。
(2).时间戳
发送者和接收者时钟一致,且考虑传输时延下。消息中包含时间戳,接收者收取消息时,只对指定时间偏差范围内的消息执行处理。
_2.密钥推测攻击
消息认证码来说,应保证不能根据MAC值推测出通信双方所使用的密钥。
HMAC中就是利用单向散列函数的单向性和抗碰撞性来保证无法根据MAC值推测出密钥。
在生成消息认证码所使用的密钥时,必须使用密码学安全的、高强度的伪随机数生成器。
4.消息认证码无法解决的问题
_1.对第三方证明
消息认证码中通过共享密钥执行认证功能。共享密钥消息发送者,消息接收者都知道。
这样对于第三方,给定一条包含消息认证码的消息,只能知道验证通过下,此消息必然由持有共享密钥双方之一发出。但具体是两者中哪一个无法知道。数字签名可解决此问题。
_2.防止否认
消息认证码只能向第三方证明消息必然由通讯双方之一发出,但无法证明是那个发的。这样实际发出一方,可以否认自己曾发出消息。数字签名可解决此问题。
1.签名的生成和验证
数字签名中也同样会使用公钥和私钥组成的密钥对,不过这两个密钥的用法和公钥密码是相反的,即用私钥加密相当于生成签名,而用公钥解密则相当于验证签名。
用公钥加密所得到的密文,只能用与该公钥配对的私钥才能解密;同样地,用私钥加密所 得到的密文,也只能用与该私钥配对的公钥才能解密。由于公钥是对外公开的,因此任何人都能够用公钥进行解密,这就产生了一个很大的好处,即任何人都能够对签名进行验证。
2.数字签名的方法
_1.直接对消息签名的方法
(1).Alice用自己的私钥对消息进行加密
用私钥加密得到的密文就是Alice 对这条消息的签名
(2).Alice将消息和签名发送给Bob
(3).Bob用Alice的公钥对收到的签名进行解密
如果收到的签名确实是用Alice的私钥进行加密得到的密文(签名),那么用Alice的公钥应该能够正确解密。
(4).Bob将签名解密后得到的消息与Alice 直接发送的消息进行对比
如果两者一致,则签名验证成功;如果两者不一致,则签名验证失败。
_2.对消息的散列值签名的方法
(1).Alice用单向散列函数计算消息的散列值
(2).Alice用自己的私钥对散列值进行加密
用私钥加密散列值所得到的密文就是Alice对这条散列值的签名
(3).Alice将消息和签名发送给Bob
(4).Bob用Alice的公钥对收到的签名进行解密
(5).Bob将签名解密后得到的散列值与Alice 直接发送的消息的散列值进行对比
这样的数字签名,可以同时达到验证完整性(防止篡改),验证来自指定发送者的效果。
3.数字签名的应用实例
_1.安全信息公告
公告发布方对发布的消息附带数字签名,这样接收者可以验证公告的确是可信的发布方发布的。
_2.软件下载
软件中包含数字签名,可以验证软件确实来自可信发布者。
4.通过RSA实现数字签名
(1).用RSA生成签名
这里所使用的D和N就是签名者的私钥。生成签名后,发送者就可以将消息和签名发送给接收者了。
(2).用RSA验证签名
这里所使用的E和N就是签名者的公钥。
5.对数字签名的攻击
(1).中间人攻击
指的是中间人介入发送者,接收者之间。
解决办法是:接收者有办法验证解密所用的公钥的确来自可信的发送者。解决方法是使用公钥证书。公钥证书涉及到信任链。
(2).对单向散列函数的攻击
如果先用单向散列函数对消息计算散列值,再对散列值结合私钥加密生成数字签名。也需要保证单向散列函数强度高,以便阻止不同消息散列值一致下,使得数字签名丧失完整性检测功能。
(3).利用数字签名攻击公钥密码
假设A向B发消息。A持有B的公钥。
A用B的公钥加密消息。加密消息被C劫持。C请求B对劫持消息执行数字签名。
假设B执行数字签名的公钥-私钥对,和对外执行公钥加密的公钥-私钥对相同。
B对劫持消息执行数字签名等同于对消息解密。
6.数字签名无法解决的问题
基于散列值的数字签名,可以解决完整性验证,可以解决发送者身份验证。
要正确使用数字签名,有一个大前提,那就是用于验证签名的公钥必须属于真正的发送者。
解决公钥合法性验证,需要用到证书。其中涉及到信任链问题。
1.证书
公钥证书里面记有姓名、组织、邮箱地址等个人信息,以及属于此人的公钥,并由认证机构施加数字签名。只要看到公钥证书,我们就可以知道认证机构认定该公钥的确属于此人。公钥证书也简称为证书。
要验证证书,又需要认证机构的公钥。
证书存在的意义在于我们使用数字签名来确认消息发送者身份合法性时候,需要验证持有的用来验证数字签名公钥的合法性。
证书将消息发送者的公钥合法性验证转移到了证书发布者公钥合法性验证。问题依然存在,但转移了。
上图展示了消息接收者Bob向认证机构注册,消息发送者Alice通过认证机构获得证书,并采用认证机构公钥验证证书进而得到消息接收者公钥的流程。
上图中获得的公钥,被用于公钥加密,但证书最大意义是用于对Bob的数字签名进行验证,以便证明消息确实是Bob发出的。
2.证书标准规范
证书是由认证机构颁发的,使用者需要对证书进行验证。其中使用最广泛的是由ITU(国际电信联盟)和 ISO(国际标准化组织)制定的X.509_规范(RFC3280)。
3.公钥基础设施(PKI)
_1.什么是公钥基础设施
公钥基础设施是为了能够更有效地运用公钥而制定的一系列规范和规格的总称。公钥基础设施一般根据其英语缩写而简称为 PKI。
_2.PKI的组成要素
● 用户:使用PKI的人
● 认证机构:颁发证书的人
● 仓库:保存证书的数据库
_2.1.用户
用户就是像Alice、Bob这样使用PKI 的人。
用户包括两种:一种是希望使用PKI注册自己的公钥的人,另一种是希望使用已注册的公钥的人。
我们来具体看一下这两种用户所要进行的操作。
_2.1.1.注册公钥的用户所进行的操作
(1).生成密钥对(也可以由认证机构生成)
(2).在认证机构注册公钥
(3).向认证机构申请证书
(4).根据需要申请作废已注册的公钥
(5).解密接收到的密文
(6).对消息进行数字签名
_2.1.2.使用已注册公钥的用户所进行的操作
(1).将消息加密后发送给接收者
(2).验证数字签名
_2.2.认证机构(CA)
认证机构是对证书进行管理的人。认证机构具体所进行的操作如下。
_2.2.1.生成密钥对(也可以由用户生成)
生成密钥对有两种方式:一种是由PKI用户自行生成,一种是由认证机构来生成。
在认证机构生成用户密钥对的情况下,认证机构需要将私钥发送给用户。
_2.2.2.在注册公钥时对本人身份进行认证
_2.2.3.生成并颁发证书
_2.2.4.作废证书
要作废证书,认证机构需要制作一张证书作废清单,简称为CRL。
CRL是认证机构宣布作废的证书一览表,具体来说,是一张已作废的证书序列号的清单,并由认证机构加上数字签名。证书序列号是认证机构在颁发证书时所赋予的编号,在证书中都 会记载。
PKI 用户需要从认证机构获取最新的CRL,并查询自己要用于验证签名(或者是用于加密) 的公钥证书是否已经作废。这个步骤是非常重要。
_2.3.仓库
仓库是一个保存证书的数据库,PKI用户在需要的时候可以从中获取证书。
_3.证书的层级结构
用来验证数字签名的认证机构的公钥,怎样才能判断它是否合法呢?
对于认证机构的公钥,可以由其他的认证机构施加数字签名,从而对认证机构的公钥进行验证,即生成一张认证机构的公钥证书。
这样可以构成一个层级结构。
层级的顶点,称为根CA。对根CA,该机构的公钥的证书由自己给自己颁发。可以认为无条件信任该机构的公钥是可信的。
我们希望通过证书给目标公钥的获取添加一重验证机制,来保证目标公钥是可信的。
利用证书我们并没有解决如何保证公钥来自可信发布者的问题,我们只是通过转移问题构建了一个层次化信任链。通过对信任链的根的公钥无条件信任来让其运作起来。
_4.攻击
_4.1.在公钥注册之前进行攻击
假设Bob生成了密钥对,并准备在认证机构注册自己的公钥。在认证机构进行数字签名之 前,主动攻击者Mallory将公钥替换成了自己的。这样一来,认证机构就会对 “Bob的个人信息”和 “Mallory的公钥”这个组合进行数字签名。
_4.2.注册相似人名进行攻击
证书是认证机构对公钥及其持有者的信息加上数字签名的产物,对于一些相似的身份信息,计算机可以进行区别,但人类往往很容易认错,而这就可以被用来进行攻击。
_4.3.窃取认证机构的私钥进行攻击
主动攻击者Mallory想出了一个大胆的攻击方法,那就是窃取认证机构的私钥。如果得到了认证机构的私钥,那么任何人就都可以以该认证机构的身份颁发证书了。
_4.4.攻击者伪装成认证机构进行攻击
任何人都可以成为认证机构。当然,你的认证机构是否被其他认证机构所认可就是另外一码事了。
_4.5.钻CRL的空子进行攻击
从公钥失效到 Alice 收到证书作废清单(CRL) 需要经过一段时间,主动攻击者 Mallory可以利用CRL 发布的时间差来发动攻击。
_4.6.钻CRL的空子进行攻击
简单说就是公钥发布者,先是利用数字签名发消息,再向认证机构注销公钥证书,后续不承认自己曾经发出过此消息。谎称消息是自身公钥被盗取后,盗取者发送的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。