密码技术之认证

第二部分:认证

  当比较两条消息是否一致时,我们不必直接对比消息本身的内容,只要对比它们的“指纹”就行了。

  一、单向散列函数(one-way hash function)

    单向散列函数也称为消息摘要函数(message digest function)、哈希函数或者杂凑函数。

    单向散列函数有一个输入和一个输出,其中输入称为消息(message),输出称为散列值(hash value)也称为消息摘要(message digest)或者指纹。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。所谓完整性是指有没有被篡改,或称为一致性。

    这里的消息可以是文字,图片或者文件等。并且散列值的长度和消息的长度无关,无论消息的大小是多少,散列函数都会计算出固定长度的散列值。如SHA-256单向散列函数,它计算出的长度永远

是256bit。

  单项散列函数的性质

  (1)、根据任意长度的消息计算出固定长度的散列值

  (2)、能够快速计算出散列值

  (3)、消息不同,散列值也不相同(哪怕1bit,散列值也不同),难以发现碰撞的性质称为抗碰撞性,密码技术中所使用的单向单列函数,都具备抗碰撞性。也就是说难以找到两条消息的散列值相同。

  (4)、具备单向性,指无法通过散列值反算出消息的性质。破镜不能重圆

  单项散列函数的实际应用

  1、检测软件是否被篡改

  2、基于口令的加密

    单向散列函数也被用于基于口令的加密(Password Based Encryption,PBE)。PBE的原理是将口令和盐(slat,通过伪随机数生成器产生的随机值)混合后计算其散列值,然后将这个散列值用过加密的密钥。

  3、消息认证码

    消息认证码是将“发送者和接收者之间的共享密钥”和“消息”混合后计算其散列值。使用消息认证码可以检测并防止通信过程中的错误、篡改以及伪装

  4、数字签名

    数字签名的处理非常耗时,因此一般不会对整个消息内容直接施加数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对这个散列值施加数字签名。

  5、一次性口令

    一次性口令经常被用于服务端对客户端的合法性认证。在这种方式中,通过使用单向散列函数可以保证口令只在通信链路上传送一次,因此即使窃听者窃取了口令,也无法使用。

  常用的单向散列函数

  推荐使用SHA-2、SHA-3

  1、MD4,MD5,MD(Message Digest的缩写)

  MD4,能够产生128bit的散列值,已经不安全了

  MD5,能够产生128bit的散列值,不过MD5的强碰撞性已经被攻破,也就是说,现在能够产生具备相同散列值的两条不同的消息,因此也已经不安全了。

  2、SHA-1、SHA-256、SHA-384、SHA-512

  SHA-1:能够产生160bit的散列值的单向散列函数,其强碰撞性已于2005年被攻破,目前已经不推荐使用

  SHA-256、SHA-384、SHA-512,它们的散列值长度分别是256bit、384bit和512bit,这些单向散列函数合起来统称为SHA-2。它们的消息长度也存在上限(SHA-256的上限接近于2^64bit,SHA-384和SHA-512的上限接近于2^128bit)

  3、PIPEMD-160

  能够产生160bit的单向散列函数,其强碰撞性已于2004年被攻破,除了以兼容性为目的外,其他情况下都不推荐使用。比特币中使用的就是PIPEMD-160。

  3、SHA-3

  2012年确定了Keccak算法作为SHA-3的标准。

  其采用了与SHA-2完全不同的结构、并且结构清晰,易于分析、能够适用于各种设备,也适用于嵌入式应用、在硬件上的实现显示了很高的性能、比其他最终候选算法安全性边际更大。

  Keccak

  Keccak可以生成任意长度的散列值,但为了配合SHA-2的散列值长度,SHA-3标准中共规定了SHA3-224、SHA3-256、SHA3-384、SHA3-512这个4个版本。在输入长度上限方面没有长度限制。

  单向散列函数无法解决的问题

  使用单向散列函数可以实现完整性也叫一致性的检查,但有些情况下即便能够检查完整性也是没有意义的。比如攻击者伪装成发送者向接收者发送了消息和散列值。这时接收者能够通过单向散列函数检查消息的完整性,但是却无法检查出发送者的身份是否被伪装了。也就是说,单向散列函数能够辨别出”篡改“,但无法辨别出”伪装“

  因此,仅仅确认消息的完整性是不够的,还需要进行认证。用于认证的技术包括消息认证码和数字签名。

  二、消息认证码(Message Authentication Code)

  使用消息认证码可以判断消息是否被篡改,以及是否有人伪装成发送者发送了该消息。

  如针对汇款请求,我们需要关注汇款请求的完整性和认证这两个性质。完整性,要能够确认汇款请求的内容没有被篡改,如收款账号和收款金额。认证,要能够确认消息是谁发送的,没有被攻击者伪装。

  消息认证码是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC。

  消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据成为MAC值。

  根据任意长度的消息输出固定长度的数据,这一点和单向散列函数很类似。但是单向散列函数中计算散列值时不需要密钥,相对地,消息认证码中则需要使用发送者与接收者之间共享的密钥。

  可以理解为,消息认证码是一种与密钥相关联的单向散列函数。

  消息认证码的密钥配送问题

    消息认证码的发送者和接收者之间需要共享密钥,这与对称密码类似,密钥配送方式和对称密码也相同,如使用公钥密码、Diffie-Hellman密钥交换、密钥分配中心,或者使用其他安全的方式发送密钥等。

  消息认证码的应用实例

    1、SWIFT

      Society for Worldwide Interbank Financial Telecommunication,环球银行金融电信协会的简称,其目的是为国际银行间的交易保驾护航。银行与银行之间是通过SWIFT来传递交易消息的,而为了确认消息的完整性以及对消息进行认证,SWIFT中使用了消息认证码。

    2、IPsec  

      是对互联网基本通信协议——IP协议增加安全性的一种方式。在IPsec中,对通信内容的认证和完整性校验都是采用消息认证码来完成的

    3、SSL/TLS

      是安全通信协议,对通信内筒的认证和完整性校验也使用了消息认证码

  消息认证码的实现方法

    (1)使用SHA-2之类的单向散列函数可以实现消息认证码,其中一种实现方法称为HMAC

    (2)使用AES之类的分组密码实现,将分组密码的密钥作为消息认证码的共享密钥来使用,并用CBC模式将消息全部加密,初始化向量IV是固定的,将最后一个分组密文作为MAC值。AES-CMAC(RFC4493)就是一种基于AES来实现的消息认证码。

  消息认证码无法解决的问题

    1、对第三方证明

    假设Bob在接收了来自Alice的消息之后,想要向第三方验证者Victor证明这条消息的确是Alice发送的,但是用消息认证码无法进行这样的证明,因为,首先,Victor要校验MAC值,就需要知道Alice和Bob之间共享的密钥。能够计算出正确MAC值的人只有Bob和Alice,在他们两个人之间进行通信时,可以断定是对方计算出了MAC值,这是因为共享这个密钥的双方之中,有一方就是自己。然而,对于第三方Victor,Alice和Bob却无法证明是对方计算出了MAC值,而不是自己。

    2、防止否认

    假设Bob收到了包含MAC值的消息,这个MAC值是用Alice和Bob共享的密钥计算出来的,因此Bob能够判断这条消息的确来自Alice。但是上面说的Bob无法向Victor证明这一点,也就是说,发送者Alice可以向Victor声称:我没有向Bob发送过这条消息,这样的行为就称为否认

  三、数字签名

   消息认证码无法防止否认

猜你喜欢

转载自www.cnblogs.com/yangyongjie/p/11728135.html
今日推荐