读书笔记-《第二章-哈希函数》

书籍信息

书名:《深入浅出密码学》

作者:[ 美 ] 戴维 • 王(David Wong)

译者:韩露露 ,谢文丽 ,杨雅希


第二章:哈希函数

  • MD5和SHA-1已经被认为是有缺陷的。
  • 目前广泛使用的哈希函数是SHA-2,SHA-2算法有4个不同的版本,分别产生224、256、384和512比特的输出;其名字分别为:SHA-224、SHA-256、SHA-384、SHA-512,其中SHA-512/224和SHA-512/256算法是通过截断SHA-512算法的输出产生的两个变种算法,它们分别提供224比特和256比特的输出。使用openssl计算如下图:

  • 虽然SHA-2是一个完美的哈希函数,但它不适合用于计算秘密消息的哈希值,这是因为SHA-2函数使用的Merkle-Damgard构造存在一个缺点,使得SHA-2在计算秘密消息的哈希值时容易受到长度扩展攻击(Length Extension)。
  • 已知MD5和SHA-1哈希函数已被破解,而且SHA-2哈希函数容易受到长度扩展攻击,2007年美国国家标准与技术委员会(NIST)组织了一次公开竞赛,产生了一个新的哈希函数标准:SHA-3,SHA-3和SHA-2都满足哈希函数的三个安全属性,即:(1)抗第一原像性(抗第一原像性意味着无法从一个摘要找到它对应的输入);(2)抗第二原像性(抗第二原像性意味着根据一个输入和它的摘要不能够找到一个不同的输入,使哈希函数生成相同的摘要);(3)抗碰撞性(抗碰撞性是指人们应该无法找到两个随机的输入,而这两个输入又能产生相同的哈希值)。但是SHA-3哈希函数不容易受到长度扩展攻击,并可用于计算秘密消息的哈希值。因此SHA-3成为当前主要推荐使用的哈希函数。与SHA-2一样,SHA-3也提供了一些变体,这些变体在名称中都包含SHA-3字样:SHA-3-224、SHA-3-256、SHA-3-384和SHA-3-512。

  • 其后出现的SHAKE和cSHAKE(两个可扩展输出的函数),这也是两个主要的哈希函数标准。我们知道上面介绍的SHA-2和SHA-3是定义明确的哈希函数,它们接收任意长度的输入并分别产生随机和固定长度的输出。许多密码协议需要这种类型的原语,但不希望受到哈希函数摘要为固定大小所带来的一些限制。出于这个原因,SHA-3标准引入了一种更通用的原语,称为扩展输出函数(Extendable Output Function)或XOF(发音为:"zoff")。SHAKE和cSHAKE就是两种标准化的XOF。

    • 联邦信息处理标准(FIPS)和SHA-3标准中指定的SHAKE函数可以看作一个产生任意长度输出的哈希函数。SHAKE结构和SHA-3结构基本相同,不同之处在于SHAKE运行速度更快。

    • 生成不同输出长度的哈希函数非常有用,它不仅可以用于生成摘要,还可以用于生成随机数、派生密钥等。注意:除了SHAKE的输出为任意长度外,我们可以把SHAKE函数和SHA-3算法视为两个一样的算法。

    • 这种结构(可以产生任意长度输出的结构)在密码学中非常有用,以至于SHA-3标准化一年后,NIST发布了其特别版本800-185,其中包含一个名为cSHAKE的可定制SHAKE函数。cSHAKE与SHAKE非常相似,不同之处在于cSHAKE需要一个自定义字符串。此自定义字符串可以为空,也可以是任意字符串。如下是一个在伪代码中使用cSHAKE的例子:

    • cSHAKE(input="hello world", output_length=256, custom_string="my_hash")
        
        ->b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
  •  注意:cSHAKE与SHAKE、SHA-3都是确定性算法(这里理解下“确定性”该如何解释:给定相同的输入,总是产生相同的输出,这里针对哈希函数来说就是:给定相同的输入,哈希函数总是产生相同的输入),但由于可以使用不同的自定义字符串,cSHAKE算法能在相同的输入下产生不同的摘要。这样的特性使得我们可以自定义XOF。这在某些协议中很有用,例如,必须使用不同的哈希函数才能使得安全性证明顺利执行的协议。我们成cSHAKE算法的这种特性为域隔离(Domain Separation)
  • 密码学中的黄金法则:如果在不同的应用实例中使用相同的密码原语,请不要使用相同的密钥(如果需要密钥),或者使用相同的密钥时应用域分离。

  • 使用元组哈希(TupleHash)避免模糊哈希:元组哈希允许我们使用非歧义编码,确定性地计算字段列表的哈希值。通常,只要始终确保在计算哈希值之前,先对输入进行序列化(Serialize),就可以安全地使用任何哈希函数。将输入序列化意味着总是存在反序列化方法(即:根据序列化结果可以恢复原始输入)。如果可以反序列输入的数据,就不会在字段的划分上产生任何歧义了。

  • 口令哈希(Password Hashing)算法。

    • 通常可以使用加盐(Salts)技术解决直接存储用户口令对应的哈希值,导致彩虹表攻击的情况;其中盐值指的是对每个用户公开且不同的随机值。(即:我们要对加盐的口令计算其哈希值)

    • (个人理解:即使使用了加盐的方式避免彩虹表攻击,但是由于哈希函数运算速度是很快的,攻击者每秒可以产生很多口令,然后进行尝试暴力破解)所以我们想有一种机制来减缓此类攻击。此时就可以采用口令哈希,即计算用户口令的哈希时就采用口令哈希算法,口令哈希算法的运行速度很慢,目前口令哈希的最优选择是Argon2,Argon2算法是内存困难的(Memory Hard),内存困难意味着只能通过优化内存访问来优化算法。换句话说,优化算法的其余部分并不会给攻击算法带来太多的好处。即使是专用硬件,通过优化内存访问来改善攻击效果,其改善程度也是有限的(CPU周围只能放置这么多缓存),因此内存困难函数在任何类型的设备上运行都很慢。当要防止攻击者在计算函数时获得不可忽视的速度优势时,内存困难函数就是我们的一个理想选择【这一段话,用大白话说就是:我的网站在存储用户名和用户口令对应的哈希值时,计算哈希值使用具有<内存困难特性的口令哈希函数,如Argon2>,然后把通过口令哈希函数计算的用户口令对应的哈希函数存储数据库中,如果攻击者攻破了我网站的数据库,把用户名和其对应的所有口令哈希值都拿到了,此时攻击者如果想要暴利尝试破解哈希值对应的明文口令,就必须使用相同的哈希函数进行暴力破解计算,而Argon2是属于口令哈希函数,其特点是内存困难的,攻击者在运行这个Argon2函数时很慢,每秒不会产生很多哈希值,这样就很好的减缓了攻击者暴力破解的危害性】

    • 总结就是:对口令进行哈希时,应使用专门设计的、运行速度较慢的哈希函数,Argon2算法就是口令哈希函数的最优选择。

  • 第二章学习的不同哈希函数的总结图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值