加密故障是一个极其严重的问题,以至于它们成为OWASP TOP 10中的 A2 位置之一,自 2017 年以来排名不断攀升。
如果您认为在网络中传输或存储在服务器上的所有数据都是(或应该)加密的,那么您就会明白,失败将导致灾难性的情况,但我听到问题来了……这种情况怎么会发生?
如果它们是故事……它们应该是埃德加·爱伦·坡写的……
密码算法失败的主要原因有:
1. 脆弱的实施
2. 使用弱算法
3. 密钥生成的弱点
加密货币恐怖故事:Heartbleed
加密失败:HEARTBLEED
2014 年,OpenSSL 中发现了一个漏洞,OpenSSL 是一个广泛用作开源项目的库,用于帮助在互联网通信中实现 SSL/TLS(例如浏览器左上方著名的挂锁),使通信加密,从而更加安全。
该漏洞 震惊了互联网世界:它允许攻击者读取部分服务器内存,从而可能暴露私钥、用户名、密码和其他敏感数据。
这是一个导致灾难性后果的加密失败的例子。
该缺陷于 2012 年在该库的 1.0.1 版本中与Heartbeat扩展一起引入(因此它活跃了大约 2 年)。让我们尝试去理解一些事情。
引入的新功能 Heartbeat 做了一件简单的事情:验证 SSL/TLS 连接是否仍然处于活动状态。他是怎么做到的?
客户端向服务器发送包含指定其大小的数据的心跳消息,服务器用相同的数据响应客户端,进而指定其大小。
一切都非常线性,但是引发全球恐慌的问题在哪里?
具体来说……他们并没有打算检查心跳消息中声明的数据大小是否与发送的数据大小相同。
例如,通过发送 1 字节数据但声明 200,服务器响应已发送的数据字节和从相邻存储单元获取的 199 字节数据,以达到 200 字节。可爱吧?通过这种方式,服务器可以发送任何类型的数据:密码、个人数据、加密密钥等。
然而这个故事有一个美好的结局:一旦发现就立即解决。
当需要加盐时……关于密码
决定性地改变范式,我们从加密失败的恐怖故事转向烹饪问题:虽然有句话“太咸了扔掉,不咸了吃”,但密码上需要加密盐。如果不这样做,就会将密码等敏感数据暴露给彩虹表攻击等加密漏洞。但我们还是按顺序来吧。
哈希值。如今,99.99% 的密码保存都是以哈希的形式进行的(要了解更多信息,请参阅我们的Davide Cavallini的文章 。希望我们的 Davide 不会介意我,我给出一个美食领域的定义:想象一下你有一个盘子(密码),你将其插入一个大锅(哈希函数)中,从这个大锅中会产生一种独特的药剂(哈希),它以一种独特的方式代表你的菜肴:
1. 即使菜肴中的一个小变化也会完全改变药水。
2. 相同的钥匙总是产生相同的药水
3. 不可能从药剂中追踪到原始钥匙
4. 很难找到两种不同的菜肴可以生产出相同的药水。
危险的彩虹。不幸的是,今天有一些已经计算出的密码散列表(称为彩虹表)可以用来尝试破译被盗的密码。因此,考虑到现有的工具,没有任何努力,并且到目前为止,仅哈希算法是很弱的。
加盐哈希。这里盐发挥了作用(在技术术语中,实际上使用了“盐”这个词,即英语中的盐,因此烹饪比较对我来说似乎很合适):正如它在食品领域是一种强大的防腐剂一样,它也在食品领域中发挥作用。密码领域。现在,想象一下在将魔法钥匙放入大锅之前,在其上添加少许盐。这使得该药水更加独特。以下是优点:
即使使用同一道菜,由于盐的原因,两种药水也会有所不同
彩虹桌变得毫无用处,因为每种药水都需要独特的菜和盐组合
因此,密码加盐是加密防御的加强,因此不使用它会产生漏洞。
弱键
“在跳舞的片段中,加密的秘密。”这篇古老的作品向我们揭示了一个巨大的秘密:密码学就在我们身边,它拥抱我们,以其谨慎的存在陪伴我们。但是什么时候会出现加密失败呢?您添加过数字签名吗?如果这样做,您就使用了一种称为非对称加密的加密模式。您通过使用您的私钥加密该文档来签署该文档。该密钥有一个派生物,称为公钥,由于它是公开的,因此任何人都可以破译该文档,从而验证签名是否是您的。
即使私钥与公钥相关,也无法由此推导出来,除非……
可用于生成密钥和实现非对称加密的算法都在公共领域,因此不存在秘密。
如果你知道加密方法,那么强度在哪里?力量在于琴键。
整个架构基于从公钥中找到私钥所需的能量和时间方面的夸大计算量。假设需要 3000 年(但更多)才能找到私钥并因此伪造您的签名……这有什么意义呢?
但我不能告诉你一个关于加密货币失败的故事吗?如果您读过我之前的文章,那么您现在已经了解我了……
从前,一位热衷于智力挑战和密码难题的数学家住在森林边缘的一所小房子里,远离城市的喧嚣,周围都是布满灰尘的书籍和写满方程的纸。尽管缺乏现代工具,他一直梦想着攻克RSA算法,但他拥有敏锐的头脑和对数学不可动摇的热情。
他对创建仅基于数论和数学计算的安全加密系统的可能性着迷。他决定测试一下自己,用笔和纸实现RSA算法。他在桌边坐下,拿起一张白纸,开始用他可靠的手写笔书写。
和以前一样,他选择了两个随机素数,称为 P 和 Q。P= 5和Q = 17。做出此选择后,他计算出由 P 和 Q 相乘得出的参数 n n = P ∙ Q = 5 ∙ 17 = 85。参数 n(因此 85)将是与其一起工作的模块。由 P 和 Q 的选择产生的第二个参数计算如下:z = (P-1) ∙ (Q-1) = 4 ∙ 16 = 64。z 是与模 85 相关的互质数的数量。有 64 个数字,因此如果我将 85 除以其中之一,我不会得到整数。
密钥生成。他必须选择一个数字,用 e 表示,这样它与 z 互质并且小于 85。他选择了 5,因为如果他将 64 除以 5,他不会得到整数并且小于85 因此e=5。它生成了第一个(私钥)密钥,即Kpriv = (5.85) !!现在他必须计算公钥。他必须计算数字 d,使得 d ∙ e = 1mod (85)。这意味着 d 与 e 的乘积必须是 64 加一的倍数。他发现的第一个 64 的倍数是 65。他将它除以 5,得到 13。所以:d = 13。
这是公钥Kpub = (d,n) = (13, 85) !!!
从涉及的数字来看,很明显,使用自动计算器,通过测试,可以从公共密钥中找到私钥(鉴于其弱点)。因此,过弱的密钥可能会使有效的加密算法变得不安全。
原文始发于微信公众号(网络研究观):密码学的黑暗面:当算法背叛你时
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论