深入理解HTTPS系列-密码学篇-哈希算法(二)

275 阅读6分钟

前情提要

深入理解HTTPS系列-密码学篇-随机数(一)

简介

密码学上的hash算法的作用是将一段任意长的数据转换为固定长度,也被称为摘要算法和散列算法。一般应用在数据完整性校验或消息认证上

# 以常见的md5算法为例
$ echo "Hello" | md5sum
09f7e02f1290be211da707a266f153b3  -
$ echo "Hello World" | md5sum
e59ff97941044f85df5297e1c302d260  -

在密码学中,hash算法也是一个非常基础的算法,被称为加密基元。加密基元是指将hash算法作为基础算法,可以构建出其他高级的算法,比如在MAC消息验证码和数字签名算法中都将hash算法作为了加密基元

特点

基础特性

  • 针对一种hash算法,相同输入一定得到相同的相同的输出,不同的输入极大概率得到不同的输出。
  • 单向性性。即很难从哈希值推测出原值是多少,一般采用暴力破解法,如字典攻击、彩虹表等
  • 原消息如果有很小的变化,哪怕是一个位,其哈希值较之前也得有变化
  • 很难找到两个消息,他们的hash值是一致的

高级特性

高级特性是指在密码学中,一个合格的hash算法应该具备的特点,需要满足以下要求:

  • 强抗碰撞性:如果两个不相同的值能够得到同样的摘要值,表示产生了Hash碰撞。密码学中,Hash算法必须具备强抗碰撞性,否则不应该使用
  • 弱抗碰撞性:给定一个消息和这个消息对应的摘要值,很难找到一条不同的消息也具有相同的摘要值。如果某个算法不符合该特性,表示该算法遇到了second-preimage攻击。
  • 单向性:给定一个摘要值很难找出它的原始消息,如果计算出原始消息,表示该算法遇到了preimage攻击

常见Hash算法

  • md5:输出长度128位,由美国密码学家Ronald Rivest于1991年发明的,随着计算机的发展,目前已经被证明为不安全。但是在一些特定领域,然后还是在使用,比如网站下载文件的md5校验
  • SHA-1:输出长度160位,是由美国国家安全局(NSA)设计,于1995年发布,是MD4和MD5算法的改进版本。目前也被证明存在安全漏洞
  • SHA-2:SHA-2算法的设计理念与SHA-1算法相似,都是基于迭代压缩的结构,不过SHA-2采用了更复杂的运算,增加了算法的强度和安全性。SHA-2算法是目前建议使用的Hash算法,截至目前是安全的,主要有四种算法,分别是SHA-256、SHA-512、SHA-224、SHA-384,输出的长度分别是256比特、512比特、224比特、384比特
  • SHA-3:SHA-3算法并不是为了取代SHA-2算法,而是一种在设计上和SHA-2完全不同的算法,主要有四种算法,分别是SHA3-256、SHA3-512、SHA3-224、SHA3-384,输出的长度分别是256比特、512比特、224比特、384比特。

实现原理

下面以较为经典的MD5算法讲述下哈希算法的原理:

  1. 填充消息

假设输入消息的长度为L bits,则填充的方法如下:

  • 添加一个1位到消息的末尾,即在消息的最后面添加一个二进制位1
  • 添加若干个0位,使得消息的长度满足以下条件: L + 1 + K ≡ 448 mod 512,其中K是使得L + 1 + K + 64的结果是512的倍数的最小的非负整数
  • 在消息末尾添加一个64位的二进制表示L的长度
  1. 初始化缓冲区

MD5算法使用一个128位的缓冲区来保存中间结果,缓冲区中包括四个32位的寄存器ABCD。在开始计算时,需要将这四个寄存器初始化,使它们的值为以下常数:

A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476
  1. 循环计算

MD5算法将处理后的消息以512位为一组进行划分,然后针对每组进行循环计算,每个循环中对缓冲区进行更新。这些512位的分组消息块被划分为16个32位的数组,称为M。每个循环包括以下四个步骤:

  • 将寄存器ABCD的当前值保存为临时变量a、b、c、d,以备后用
  • 针对M1 - M16进行4 * 16次位运算,从而更新a、b、c、d的值
  • 将上一步中计算出的值加上寄存器变量,得到新的寄存器值
  • 重复执行1-3步,直到处理完所有的消息块
  1. 组合输出

处理完所有的消息块后,将缓冲区中的结果按以下顺序连接起来,得到最终的128位消息摘要 MD5(A) || MD5(B) || MD5(C) || MD5(D) 其中||表示连接操作,MD5表示对一个32位寄存器进行MD5哈希运算得到的结果。最终的128位即为md5值

应用场景

  • 唯一标识:比如对文章内容做摘要计算 这个值可以表示文章的唯一性
  • 负载均衡:比如具备会话粘滞的场景中,可以根据客户端的IP或者ID做哈希运算映射到不同的服务端实例上
  • 数据校验:一般提供某类文件下载的网站,同时都会显示文件对应的md5值,方便在下载完成后做完整性校验
  • 安全加密:如某网站在存储用户密码时,明文存储存在一定的风险,将密码经过哈希运算处理后,保存到数据库,降低了密码泄露风险(但仍面临字典攻击和彩虹表攻击的风险 一般使用加盐哈希)

总结

本文介绍了HASH的基本特性、实现原理、算法种类和应用场景,相信大家已经有了一个基本的了解。其中SHA-256算法在HTTPS中应用非常广泛,随着后续文章的深入,大家将进一步体会到hash算法的重要性。