作者回复: 赞!
作者回复: 很多同学关心这个细节,这很棒。看来这个专栏可以讲的再深入一些,聊聊算法的设计细节。 SHA-1不是使用64位的来表示输入数据长度吗?一个数据块是512位,除掉64位,还剩448位。数据是三个字节,24位。除掉24位,还剩424位。去掉补齐数据开始的标识位(也就是423前面的1),还剩423位。 这423位要用零填充。这就是423的来源。你自己试着拆解一下SHA-512?
作者回复: 比如说,填充方案里需要指明原始数据长度,指明这个数据长度的使用64位来表示。64位能表示的数最大就是2^64。如果需要进行散列值计算的数据超出2^64,这个填充方案就没有办法使用了,因为长度超出了它能够表达范围,溢出了。
作者回复: 看图前面的ABC,就是这三个字节。 例子而已,例子使用了三个字节,所以就是三个字节。
作者回复: 对的。448的来源,是要剪掉表达数据长度的位数,这个位数对于SHA-256来说,是64位。 512 - 64 = 448.
作者回复: 每一个类别的算法,都会有整理。另外,专栏结课的时候会有一个总的表格。
作者回复: 我特别喜欢这样的问题,这就是我在开篇词里说的发现新问题。你在学习群里找一下我的微信号,如果有需要,我可以送你一门极客时间的其他课程,或者我自己的《代码精进之路》。 SHA-1和SHA-2的算法设计,如果输入数据长度是数据块的整数倍,就用补齐数据再补一个数据块。
作者回复: MD5是退役的算法了。SHA-1也很危险了,但是由于SHA-1算法应用太广泛,还有很多遗留系统在使用。现在主流的浏览器,还有密码算法类库(包括Java),已经把SHA-1禁止掉了(特别是数字签名)。 CRC16,CRC32不是单向散列函数,不属于密码学的算法,一般也不会当中密码学算法来使用。
作者回复: 好问题! 前面的abc使用的是位,64和128指的也是位。24表示输入数据长度,423位表示除了表示数据长度的位数,以及数据补齐开始的标识位外,还需要的补齐数据。 我在另外一个回复里,拆解了423位是怎么来的。你找找看?
作者回复: TLS的签名套件里的SHA-1指的是HMAC算法。基于SHA-1的HMAC算法,虽然目前已经不推荐使用了,但是它的安全性目前看还是足够的。我们后面还会讲HMAC。我个人建议HTTP server禁止掉使用SHA-1的密码套件。如果禁止掉TLS 1.0/1.1没有兼容性问题,禁止掉使用SHA-1的密码套件,一般的应该也没什么问题。