概论
单项散列函数又称为安全散列函数或者哈希函数,可以将一段可变长度是输入数据转化为固定长度的一段输出值。 输入数据通常称为消息,输出数据通常称为消息摘要或者摘要,可用于检查消息的完整性。
常用的单向散列算法有MD4/5系列和SHA系列等。由于MD4、MD5算法都已被攻破,渐渐退出历史舞台,而SHA系列算法在物联网安全领域比较常见,特别是SHA256算法。
额外提一点,提到单向散列函数的特性,很多人一下子想到,我们经常使用到的CRC校验,例如将一段可变长度的数据经过CRC校验后,生成2个字节的校验值,那这个算不算是单向散列函数? 单从这个特性上看,CRC也算是单向单列函数,但是由于CRC不是完全单向性,从CRC值反推出满足要求的消息并不困难,所以CRC通常只用来对数据的完整性校验,而不能用来检查数据是否被恶意篡改。
单向散列函数性质
单向散列函数为消息产生了一个指纹,能够实现对消息的完整性检测,单向散列函数需要满足的性质如下:
- 输入长度可变: 输入为任意长度的消息
- 输出长度固定 输出的消息摘要长度固定
- 高效率 尽管长的消息计算时间相对会长一些,但整体计算速度还是很快的
- 单向性 给定消息可以算出摘要值,但根据摘要值反推出消息是不可行的
- 抗碰撞性 找到两个消息他们的摘要是相同的,在计算上是不可行的
单向散列函数使用方法
- A准备好消息数据
- A使用单向散列函数计算消息摘要
- A将消息和消息摘要一起发送给B
- B接收到消息和消息摘要后,使用单向散列函数计算消息的摘要。
- 对比接收到的消息摘要和自己计算出来的消息摘要是否一致。
- 如果一致则说明消息未被损坏或篡改,如果不一致则说明消息被损坏或恶意篡改。
单向散列函数应用
基于单向散列函数的性质,单向散列函数可以应用在消息认证码、数字签名、随机数生成器和一次性口令等密码技术中。也可以作为普通散列函数独立使用。下面分别介绍单向散列函数的具体应用。
- 消息完整性检测
单向散列函数的一个重要应用就是对消息的完整性进行检测,例如可以通过比较传输消息或文件的摘要值来判断消息是否发生了篡改,验证消息摘要的真实性就等同于验证消息本身的真实性。
- 伪随机数生成器
单向散列函数可以用来构造伪随机数生成算法,它可以用于由单个秘钥派生出多个新的秘钥。
- 消息认证码
消息认证码可以用于检测消息传输过程中的错误、篡改和伪装,其实现过程依赖于单向散列函数。消息认证码中除了单向散列函数外还加入了共享秘钥,该秘钥由发送者和接收者共享,因此消息认证码不但可以检测消息在传输过程中是否发生了错误或者篡改,还可以对发送者的身份进行认证。
- 数字签名
由于数字签名的计算过程比较耗时,在对消息计算签名之前,通常会使用单向散列函数对消息计算消息摘要,然后对消息摘要进行签名。
- 一次性口令
单向散列函数可以构造一次性口令,服务器通常使用一次性口令来验证客户端的合法性,客户端使用单向散列函数计算出令牌和同步资源的消息摘要,客户端再把消息摘要发送给服务器进行认证。
单向散列函数无法解决的问题
散列函数能够辨别出“篡改”,但是无法辨别出“伪装”。对于一条消息不仅需要确认消息的完整性,还需要确认这个消息发自与谁。这仅仅靠完整性检查是不够的,还需要进行消息认证。认证的技术包括消息验证码和数字签名。
消息验证码能够向通信对象保证消息没有被篡改。数字签名不仅能够向通信对象保证消息没有篡改,还能够向所有第三方做出这样的保证。
SHA256 算法实现详解
由于MD4/5已经被攻破,渐渐退出历史舞台,SHA0、SHA1算法由于存在缺陷已不再使用。而SHA256在物联网中有这个较为广泛的应用。
<未完待续>
SHA256算法在mbedtls中的API讲解和测试示例
<未完待续>