我们没有加密你的密码,我们对它进行了散列

2020-09-05 10:38:27

你可能刚刚发现你的数据泄露了。相关组织可能已经联系过您,并告知您的密码已泄露,但幸运的是,他们对其进行了加密。但不管怎样,你都应该改一改。哈?。当数据暴露给非预期的各方时,加密的全部意义不就是保护数据吗?啊,是的,但它没有加密,它是散列的,这就是关键的不同之处:

一遍又一遍地说密码是“加密的”并不能说明这一点。它们是加密散列,所以在那里做得很好,但事实上,它们建议每个人都更改他们的密码,这说明即使是好的散列也有它的风险。Https://t.co/21V6Vte6Wa。

-特洛伊·亨特(@troyHunt)2020年9月2日。

我一次又一次地看到这一点,我不只是某个书呆子书呆子,加密和散列之间的区别是你的密码在数据泄露后如何被恢复和滥用的风险的根本。我经常听到人们以用户不理解哈希的含义为理由,为密码存储的错误描述辩解,但我实际上听到的是,被入侵的组织只是无法以人们理解的方式解释这一点。所以这里是一句话:

密码散列是您的密码的一种表示形式,无法反转,但如果有人再次对其进行散列并获得相同的结果,仍可以确定原始密码。

让我们从密码散列的实际含义开始,以一种普通人可以理解的方式开始深入挖掘:有两个定义属性与此讨论相关:

散列过程是确定性的:您将始终使用相同的输入获得相同的输出。

这对于密码存储很重要,因为它意味着以下内容,因为它们与前面的几点相关:

原始密码永远不会存储,因此即使对您提供密码的网站也是保密的。

由于是确定性的,当密码在注册时被散列时,它将与提供的相同密码相匹配,并且在登录时被散列。

这是一个很好的密码,因为它有小写、大写、数字和非字母数字值,而且长度为8个字符。然而,不知何故,你的人脑看着它,决定不,它不是一个好的密码,因为你看到的仅仅是字符替换。黑客们也已经解决了这一点,这就是为什么网站上任意的合成规则是无用的。无论如何,下面是该密码的散列形式:

此哈希是使用MD5哈希算法创建的,长度为32个字符。使用MD5散列的较短密码仍为32个字符。这篇用MD5散列的整个博客帖子仍然是32个字符。这有助于说明散列和加密之间的根本区别:散列是数据的表示,而加密是受保护的数据。如果你有密钥,加密是可以反转的,这就是为什么它被用于一切,从保护你设备上的文件到你的信用卡号码(如果你把它保存在你使用的网站上),以及当它通过互联网发送到本页面的内容时。在上述每种情况下,受保护的数据都需要在将来的某个时候以其原始格式进行检索,因此需要加密。这就是密码的根本不同之处:你永远不需要取回你在注册时提供给网站的密码,你只需要确保它与你在登录时提供的密码相匹配,因此使用了散列。

那么,哈希在哪里出了问题,为什么当哈希暴露时,网站仍然要求您更改密码?下面是一个简单的演示--让我们用谷歌搜索上面的散列:

在这里,我们有一大堆网站将原始密码与散列版本进行匹配。这就是散列的确定性性质成为弱点而不是强项的地方,因为一旦散列和纯文本版本相互匹配,您现在就有了一个方便的小型可搜索索引。考虑这一点的另一种方式是密码散列太可预测,那么我们该怎么办呢?加上随机性,这就把我们带到了盐的问题上。

想象一下,如果我们不是简单地散列单词";P@ssw0rd";,而是先向其添加另外12个字符(完全是随机字符),然后对其进行散列。另一个人出现并使用相同的密码,他们得到他们自己的盐(这意味着他们自己的完全随机的字符集合),这些盐被添加到密码中,然后进行散列。即使使用相同的密码,当与唯一的盐组合时,得到的散列本身也将是唯一的。只要在登录时将注册时使用的相同盐添加到您的密码中(是的,这意味着将盐与散列一起存储在某个数据库中),这个过程就可以重复,网站可以确认密码是否正确。

问题是,如果有人拥有来自数据库写字板风格的所有数据,难道他们不能重现加盐和散列过程吗?我的意思是,你有盐和散列就在那里,有什么能阻止某人拥有一大串密码,从数据库中挑选一个盐,然后将其添加到每个密码中,对其进行哈希处理,看看它是否与破解时的密码相匹配?阻碍这项工作的唯一因素是时间;从数据库中散列一个用户记录的一大串密码需要多长时间?以Wattpad为例,超过25亿用户需要多长时间?这完全取决于所选择的散列算法。在消费级硬件上,从一开始就没有真正设计用于密码存储的陈旧过时的散列算法可以以每秒数百亿的速度进行计算。是的,对于BRAVO和更具技术含量的人来说,这就是你使用MD5或SHA-1所要做的事情,再加上a&34;b#34;s&340亿;s&34;s&340亿;s&34;a#34;s&34;s&340亿;a#34;b&34;;按照这样的猜测速度,散列密码能保持多长时间不被破解?通常不会很久。

回到这篇博客文章开头的推文中的例子,Wattpad没有加密他们的客户密码,他们对它们进行了哈希处理。用密码加密。这是一种为存储密码而设计的散列算法,真正使其有别于前述算法的是它速度很慢。我的意思是非常慢,就像创建散列要花费数千万倍的时间。作为客户,当你在网站上注册或登录时,你不会注意到这一点,因为计算你密码的哈希仍然只有零点几秒,但对于试图通过对不同可能的示例进行哈希运算,并将它们与Wattpad中的示例进行比较来破解您的密码的人来说,这会让你的生活变得更加困难。但也不是不可能。

我对密码标准很感兴趣,所以我输入了一个字符,系统告诉我它必须至少是6个。好的,现在让我们检查复杂性要求:

6是否允许所有小写字符?让我们提交注册表,并找出:

这就是问题所在,所有这些都会让我们回到Wattpad早先关于更改密码的声明中:因为Wattpad的整个密码标准似乎都可以归结为6个或更多字符,所以人们可以使用上面的密码进行注册。那个特定的密码--密码--出现在“我是否被用过Pwned Password”服务3649次:

这是一个非常糟糕的密码,不是因为缺少数字、大写或非字母数字字符(我可以很容易地做出一个全是小写的非常强的密码),而是因为它的可预测性和普及性。

了解到Wattpad允许非常简单的密码后,我列出了6个字符或更长的最常见密码列表,并将它们与它们的bcrypt散列样本进行了对比。让我们考虑这样的bcrypt散列,例如:

生成该散列的明文密码是";iloveyou";。这在Pwned密码中出现了160万次,我认为允许这样做是相当冒险的。但由于Wattpad的密码标准非常薄弱,有人(可能很多人)使用了该密码,它很容易被破解。

该版本的纯文本版本是...。等着看吧..。";Wattpad";!使用bcrypt-Generator.com这样的在线工具可以很容易地验证这些密码,该工具可以根据给定的散列检查给定的密码。