实用密码学
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
14948 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 24 讲
开篇词 (1讲)
课前必读 (1讲)
案例分析 (1讲)
实用密码学
15
15
1.0x
00:00/00:00
登录|注册

04|选择哈希算法应该考虑哪些因素?

你好,我是范学雷。
上一讲,通过讨论单向散列函数的两个困难程度,我们了解到了安全强度的计量办法,安全强度的衰减,以及常见的安全强度推荐指标,我们还对安全强度有了一个更直观的感受。
你还记得上一讲提到的,现在的应用程序要使用 128 位或者更高安全强度的算法吗?那么,对于单向散列函数来说,哪些算法能够满足这样的安全强度要求呢?我们在选择这些算法的时候,应该去考虑哪些因素呢?这就是我们这次要解决的问题。
首先,让我们先来分析一下,还有哪些算法是可用的算法。

有哪些可用的算法?

为什么要先分析有哪些可用的算法呢?因为,在选择哈希算法的时候,我们的确需要综合考虑很多因素,但是如果这个算法是不可用的,其他因素也就无足轻重了。
所以,判断一个现存的算法,还能不能继续使用是我们选择算法的第一步。根据这个标准,我把常见的算法分为了以下三类:
退役的算法;
遗留的算法;
现行的算法。
退役的算法,就是那些已经退出了历史舞台的算法它们的安全强度很弱,一定不再用了。如果你看到退役的算法还在使用,往往意味着这是一个过时的系统,或者是它的开发者缺少密码学常识(这怪不得它的开发者,毕竟密码学常识一直没有得到普及)。
如果是我们自己能够掌控的系统,一定要尽最大努力、尽快地升级算法。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

选择哈希算法时需要考虑多个因素,包括算法的安全性、性能和实际应用中可能遇到的问题。了解退役的、遗留的和现行的算法分类,以及单向散列函数的处理能力限制和来源是至关重要的。在选择算法时,应尽量选用现行的、流行的算法,如SHA-256、SHA-384和SHA-512,以确保安全性和获得较好的计算性能。同时,需要小心谨慎,避免已知的安全漏洞陷阱。在实际应用中,还需要注意长度延展攻击等常见问题。对于现有项目,应当及时更新和替换退役的和遗留的算法,以确保系统的安全性和性能。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《实用密码学》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • 彩色的沙漠
    一直没有看明白单向哈希函数关于输入数据能力的限制,找了一篇博客回头在看我们的专栏恍然大悟。 以SHA256举例:输入数据长度不是512的整数倍的话,需要预处理填充 1.在报文末尾进行填充,使报文长度在对512取模以后的余数是448 填充是这样进行的:先补第一个比特为1,然后都补0,直到长度满足对512取模后余数是448。 2.附加长度值 SHA256用一个64位的数据来表示原始消息的长度 附加长度值就是将原始数据(第一步填充前的消息)的长度信息补到已经进行了填充操作的消息后面 因此,通过SHA256计算的消息长度必须要小于$ 2^64 $,当然绝大多数情况这足够大了 最后经过上面两步448+64=512 刚好是512的整数倍 参考地址:https://blog.csdn.net/u011583927/article/details/80905740/

    作者回复: 赞!

    2020-12-01
    23
  • 于途
    老师,请问数据补齐方案示意图中的俩数字,423 和 871 具体含义是什么呢?

    作者回复: 很多同学关心这个细节,这很棒。看来这个专栏可以讲的再深入一些,聊聊算法的设计细节。 SHA-1不是使用64位的来表示输入数据长度吗?一个数据块是512位,除掉64位,还剩448位。数据是三个字节,24位。除掉24位,还剩424位。去掉补齐数据开始的标识位(也就是423前面的1),还剩423位。 这423位要用零填充。这就是423的来源。你自己试着拆解一下SHA-512?

    2020-12-01
    3
    3
  • 于途
    如果输入数据长度超过了数据补齐方案的限制,数据就没有办法分组了 老师,这句话应该怎么理解呢?

    作者回复: 比如说,填充方案里需要指明原始数据长度,指明这个数据长度的使用64位来表示。64位能表示的数最大就是2^64。如果需要进行散列值计算的数据超出2^64,这个填充方案就没有办法使用了,因为长度超出了它能够表达范围,溢出了。

    2020-12-01
    2
    2
  • 陈学彬
    老师,看了其他人留言,明白了补齐数据那张图中423 和 871的由来,但不太明白说的“数据是三个字节,24位”,这个数据是什么数据,为什么要用占用三个字节。

    作者回复: 看图前面的ABC,就是这三个字节。 例子而已,例子使用了三个字节,所以就是三个字节。

    2021-03-29
    1
  • 彩色的沙漠
    SHA256,输入长度不是512位 在报文末尾进行填充,使报文长度在对512取模以后的余数是448 填充是这样进行的:先补第一个比特为1,然后都补0,直到长度满足对512取模后余数是448。

    作者回复: 对的。448的来源,是要剪掉表达数据长度的位数,这个位数对于SHA-256来说,是64位。 512 - 64 = 448.

    2020-12-01
    1
  • 于途
    老师,针对退役的算法、遗留的算法、现行的算法,能否整理一个概览图或者表格呢?

    作者回复: 每一个类别的算法,都会有整理。另外,专栏结课的时候会有一个总的表格。

    2020-12-01
    1
  • 在下图 SHA-1 和 SHA-2 的数据补齐方案里,输入数据长度是补充数据的一部分 ————————- 这里没有理解,输入数据长度是64位或者是128怎么进行补齐的?

    作者回复: 我特别喜欢这样的问题,这就是我在开篇词里说的发现新问题。你在学习群里找一下我的微信号,如果有需要,我可以送你一门极客时间的其他课程,或者我自己的《代码精进之路》。 SHA-1和SHA-2的算法设计,如果输入数据长度是数据块的整数倍,就用补齐数据再补一个数据块。

    2020-11-30
    9
    1
  • 向东是大海
    MD5,SHA-1 是退役的算法吧?另外,循环冗余校验CRC16,CRC32是哈希算法吗,还可以在新项目中使用吗?

    作者回复: MD5是退役的算法了。SHA-1也很危险了,但是由于SHA-1算法应用太广泛,还有很多遗留系统在使用。现在主流的浏览器,还有密码算法类库(包括Java),已经把SHA-1禁止掉了(特别是数字签名)。 CRC16,CRC32不是单向散列函数,不属于密码学的算法,一般也不会当中密码学算法来使用。

    2020-11-30
    1
  • 天天有吃的
    补齐数据那张图不是很明白,423、871、24这三个数字是什么意思;还有64、128是指二进制有64、128位吗

    作者回复: 好问题! 前面的abc使用的是位,64和128指的也是位。24表示输入数据长度,423位表示除了表示数据长度的位数,以及数据补齐开始的标识位外,还需要的补齐数据。 我在另外一个回复里,拆解了423位是怎么来的。你找找看?

    2020-12-01
    2
  • 孜孜
    我唯一能想到的是,我们前几个月,disable了http server的tls1.0和1.1。但是遗憾的是tls1.2有些密码套件的签名还是sha1。

    作者回复: TLS的签名套件里的SHA-1指的是HMAC算法。基于SHA-1的HMAC算法,虽然目前已经不推荐使用了,但是它的安全性目前看还是足够的。我们后面还会讲HMAC。我个人建议HTTP server禁止掉使用SHA-1的密码套件。如果禁止掉TLS 1.0/1.1没有兼容性问题,禁止掉使用SHA-1的密码套件,一般的应该也没什么问题。

    2020-11-30
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部