「密码学」哈希为什么要将盐加在明文后面?

[复制链接]
发表于 2023-3-10 18:01:07 | 显示全部楼层 |阅读模式
众所周知,在做消息认证或者签名时,仅使用hash函数安全性是不高的,容易遭受字典和暴力破解(https://www.cmd5.com/)。所以通常会使用带密钥或加盐的哈希算法作为消息认证或者口令存储,正如标题所说,我们在检索互联网上关于加盐的实现时,内容往往都是在明文后面加上随机值:

那做消息认证的密钥或者盐可不可以加在明文前面呢?
这就引出本文的攻击方式。
MD5 算法计算逻辑

为了清楚这个攻击方式原理,需要先了解下md5的计算逻辑。
md5算法本质上是一种压缩算法,将长度小于2^64bit的任意字符压缩成128bit固定长度字符。同AES之类的分组加密算法一样,md5也需要进行分组计算。

如图所示,md5的计算需要经过两个步骤:

  • 分组&填充
  • 具体计算
1.分组&填充

首先会对明文按照512bit的长度进行分组,最后一个分组可能会发生长度不足512bit,或者刚刚512bit。
无论最后一个分组的长度是否刚好等于512bit,按照填充规则都需要进行填充,具体细节:

  • 假设明文刚好能被512整除,需要新增一个分组,在末尾8*8=64bit 按照小端存储放入原始明文的长度,分组中间剩余的bit 按照10000000的方式进行填充,形成一个总长512bit的新分组。
  • 假设整除512bit余数大于0

    • 且余数大于512-8*8 =448 bit 则需要继续填充10000(0x80000.....)至下一个分组的448bit,剩余的bit按照小端存储填充原始明文长度
    • 余数小于448bit,末尾填充原始明文长度,中间剩余部分填充填充10000(0x80000.....)

以上两个步骤用代码表示即为:
[code]        m_l = len(message)  # 原始消息长度        length = struct.pack('
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表