One-way hash function

单向散列函数有一个输入和一个输出,其中输入称为消息(message),输出称为散列值(hash value)。单向散列函数可以根据消息内容计算出散列值,而散列值就可以被检查消息的完整性。散列值的长度和消息的长度无关,以SHA-1单向散列函数为例,它所计算出的散列值的长度永远是160比特(20字节)。

单向散列函数的性质

  1. 根据任意长度的消息计算出固定长度的散列值
  2. 能够快速计算出散列值
  3. 消息不同散列值也不同
    • 两个不同的消息产生同一个散列值的情况称为碰撞(colision)
    • 难以发现碰撞的性质称为抗碰撞性(collision resistance),密码技术中所使用的单向散列函数都需要具备抗碰撞性。
    • 弱抗碰撞性:当给定某条消息的散列值时,单向散列函数必须确保要找到和该条消息具有相同散列值的另外一条消息是非常困难的
    • 强抗碰撞性是指要找到散列值相同的两条不同的消息是非常困难的。
  4. 具备单向性(one-way):指无法通过散列值反算出消息的性质。

单向散列函数的实际应用

  1. 检测软件是否被篡改 使用单向散列函数检测软件是否被篡改

(镜像站点相当于从第三方下载软件的网站)

  1. 基于口令的加密(Password Based Encrypyion,PBE)
    其原理是将口令和盐(salt,通过伪随机数生成器产生额随机值)混合后计算其散列值,然后将这个散列值用作加密的密钥。

  2. 消息认证码
    将“发送者和接受者之间的共享密钥”和“消息”进行混合后计算出的散列值。

  3. 数字签名
    先通过单向散列函数计算出消息的散列值,然后再对这个散列值施加数字签名。

  4. 伪随机数生成器
    为了保证随机数的不可预测性,可以利用单向散列函数的单向性。

  5. 一次性口令(one-time password)
    通过使用单向散列函数可以保证口令只在通信链路上传送一次,即使窃听者窃取了口令也无法使用。

单向散列函数SHA-1

SHA-1是一种能根据上限为2的64次方比特的消息计算出160比特的散列值的单向散列函数。

整体流程

1. 填充
把消息分成512比特长度的分组,最后一组如果不够512就填充成512比特,这里的512比特称为一个输入分组。

2. 计算W0 ~W79
根据输入分组的512比特计算出80个32比特的值(W0 ~ W79)。

  • 将输入分组的512比特分成32比特 x 16组,并将它们命名为W0 ~ W15
  • 剩下的W16 ~ W79的计算方法如下:

    计算W16 ~W79

3. 分组处理
对输入分组一次进行80个步骤处理,计算5个32比特的值(A ~ E)作为SHA-1的内部状态。 单向散列函数SHA-1的概要

4. 单步处理
分组处理是由80个步骤处理组成的,其中每个步骤都是基于W0 ~ W79使内部状态进行复杂变化得到处理。

对单向函数的攻击

  • 暴力破解:相当于一种试图破解单向散列函数的“弱抗碰撞性”的攻击

  • 生日攻击(birthday attack) :试图破解单向散列函数的“强抗碰撞性”的攻击

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

单向散列函数能够辨别出“篡改”但无法辨别出伪装,例如,主动攻击者M伪装成A,向B同时发送消息和散列值,这时B能够通过单向散列函数检查消息的完整性,但这只是对M发送的消息进行检查,而无法检查出发送者的身份是否被M进行了伪装。