什么时候有害哈希

前言
该文本将是无线电工程和控制系统部信息保护手册以及此培训代码中MIPT(GU)信息保护手册的重写章节之一。 完整的教程可在github上找到 (另请参阅草稿发行版 )。 我计划在Habrir上载新的“大型”文章,首先,收集有用的评论和意见,其次,为社区提供更多有关有用和有趣主题的概述材料。

可靠的加密哈希函数将纯文本转换为给定长度的文本。 这确保了“持久性”:恢复第一和第二个原型的难度。 或者,以通俗易懂的语言来表达关于第一个属性的困难,即很难获得这样的文本,其哈希函数的值将等于指定的文本。

恢复的复杂性可以理解为以下事实:为了找到第一个原型[可靠的密码散列函数],需要至少完成平均 2n1哈希操作在哪里 n-密码哈希函数输出中的位数。 使用具有大输出大小(从256位开始)的现代散列函数,信息系统开发人员可以确保不可能从散列函数值恢复原始数据。 通常他是对的。

但是,尽管存在哈希函数的可靠性,但是在一些重要的情况下,恢复反向图像甚至源文本都不是问题。 当使用散列函数毫无意义时,就是这种情况。 当可搜索源文本的变体数量时就是这种情况。

例如: 电话号码 。 带有前缀“ +7”和10位数字的不同电话号码是 1010\约233经过优化可迭代哈希值的现代设备每秒可处理数百万个哈希。 这意味着对所有可能的带有前缀的电话号码的哈希函数值的计算不超过几秒钟。

例如: 信用卡号 (PAN, 支付卡号 )。 通常,卡号会被屏蔽,显示前4(6)和/或后4位数字,而隐藏其余数字。 卡上有16位数字,是否可以对卡号进行哈希处理以便对攻击者隐藏? 不行 如果攻击者从16中收到8位数字(前4位和后4位),以及从完整卡号中获得哈希函数的值,那么攻击者可以在不到一秒钟的时间内恢复完整数字。 为此,他将需要整理一切 108\约226数字选项。

一个带有电子邮件地址的有趣示例。 似乎通过可靠的哈希函数的值,不可能恢复原始地址。 8个拉丁字母和10位数字的不同变体的数量已经给出 368\约241邮箱名称的选项,而无需考虑邮件服务的不同域( @mail.ru@gmail.com等)。 如果您采用其他允许的字符,以及加长地址,则还有更多选择。 但是……直到2006年,“ 蓝蛙” (Blue Frog) 项目开始运作,为用户提供了反垃圾邮件保护。 他使用提供商的自动通知来告知从其服务器发送的垃圾邮件,这迫使广告商拒绝将垃圾邮件至少发送到该项目参与者的那些地址。 为了了解该框是否属于参与者,已分发了一个文件,其中包含来自每个成员的邮箱地址的加密哈希函数的值的列表。

假定垃圾邮件发送者将检查其每个地址,以在此列表上发送广告,并排除找到的匹配项。 但是,带有哈希函数值的文件的存在使攻击者可以做相反的事情:识别项目参与者,并向他们发送无意义的消息加强流,以拒绝使用Blue Frog项目。 遭受这种攻击后一段时间(以及其他攻击,包括对服务器的DDoS攻击),该项目停止了工作。

和以前一样,使用哈希函数值附带的任何盐都不会影响枚举时间(但仍然可以防止字典攻击)。

所述情况的可能解决方案。

  1. 不是散列值本身,而是散列原始值和一些单独存储的秘密。 例如,不在数据库表中(与哈希函数的值一起),而是在应用程序服务器配置中。 同样成功的是,您可以对某些秘密密钥使用块加密功能来代替散列。
  2. 使用哈希函数不仅可靠,而且计算速度很慢。 密码分析者和合法用户都可以。 此类函数的示例是PBKDF2,bcrypt,scrypt和Argon2,在调用函数时,我们还会为其指示哈希迭代的次数。 但是,如果仅将散列函数的输出长度增加一位(从256或512中增加),就以二进制顺序(两倍)增加密码分析者攻击的复杂性,那么增加散列函数PBKDF2的迭代次数将使攻击的复杂性增加一倍次。 也就是说,就算算资源和消耗的能量而言,即使由合法用户获得哈希值也变得昂贵。

后记
作者将对文本的事实和其他评论表示感谢。

Source: https://habr.com/ru/post/zh-CN477416/


All Articles