seegongsik
安全

什么是密码加盐

上一课说过,密码不原样保存,而是变成哈希指纹再存。可如果两个人碰巧用了同一个密码,会怎样?同样的输入得出同样的指纹,存储的列表里就会并排出现一模一样的值。即使不知道密码,也能看出这两个人的密码是一样的。为了堵住这个缺口,要给每个人掺进一点不同的值,这就叫盐。

01

相同的密码,相同的哈希

哈希对同样的输入总给出同样的结果。正因为这样,登录时才能拿输入的指纹去跟存好的指纹比对。可这个性质也有阴影。
两个人用同一个密码,两人的哈希也会一模一样。存储的哈希列表里并排着相同的值,就算不知道密码本身,“两人密码相同”这件事也泄露了,就像看到两把锁的锁孔一样,便知道它们配的是同一把钥匙。一旦其中一人的密码被人知道,哈希相同的那个人的密码也跟着暴露。

人 A挑一个密码
人 B挑一个密码
存下的哈希
1f8ba1f8ba
密码相同,所以哈希也一模一样地并排显示

把两个人的密码选成一样或不一样。密码一样时,存下的哈希也会一模一样地并排出现。

选了同一个密码,两个哈希就完全一样。光看哈希,马上就知道它们相同。我们学过哈希没法倒算,可“相同的值得出相同的哈希”这一点不会变。
那么,要是有人把常见的密码事先算好哈希,抄成一张清单,会怎样?

02

事先做好的表为什么危险

人们常用的密码,种类比想象的少。所以完全可以事先做一张表,把这些密码和各自的哈希一行行写好。有了这张表,就能拿被攻破的存储里的哈希去表里查,一下子查出原来的密码。像“123456”“password”这样的密码,几乎每张这样的表里都有。
这不是把哈希倒算回去,而是跟事先写好的答案对一对。一张表就能一次比对海量哈希,这一点尤其危险。把这种表巧妙压缩后的版本,叫彩虹表。

存下的哈希
点一下存下的哈希
事先写好的表
?1a3f7c
?4b8e21
?9d0c55

把存下的哈希一个个点开。事先写好的表里有相同的哈希,密码就会暴露;表里没有,猜测就被挡住。

跟表里哈希相同的,旁边那一栏的密码就原样暴露;表里没有的哈希,猜测就被挡住了。危险的根源,在于同一个密码永远得出同一个哈希。
这样一来,防的办法也就看清了:只要让同一个密码在每个人那里算出不同的哈希,一张事先做好的表就再也对不上。这个办法就是加盐。

03

给密码加盐

盐是给每个人随机生成的一小段值。注册时新生成一份,不直接对密码做哈希,而是先接上这个人的盐,再对合起来的内容做哈希。
盐不是需要藏起来的秘密,可以跟哈希一起存在旁边。因为登录时要接上同样的盐,才能算出同样的指纹。盐只做一件事:让每个人的哈希都不一样。

人 A
apple+ __=apple
哈希1f8ba
人 B
apple+ __=apple
哈希1f8ba
目前只对密码做了哈希

点“加盐”按钮。两个人的密码一样,但盐不同,所以合起来的输入和哈希都不一样了。

加了盐,送进哈希的输入就变了。即使密码相同,接上的盐不同,原料就不同;而哈希只要输入稍有不同,结果就完全两样。所以盐不同,哈希也只能不同。
现在把盐关掉、打开,比一比两个用同一个密码的人,存下的哈希是什么样子。

04

相同的密码,也成了不同的哈希

没有盐的时候,两个相同密码的哈希一模一样。打开盐,即使两人的密码相同,存下的哈希也各不相同。再看哈希列表,也分辨不出谁用了同一个密码。
事先做好的表也失效了。那张表是用没加盐的密码做的,跟加了盐的哈希对不上。要用表,就得为每一份盐、也就是每一个人重新做一张,实际上就没法用了。这就好比每户人家都换了一把独一无二的锁,一把万能钥匙再也打不开所有的门。

存下的哈希
人 A1f8baapple
人 B1f8baapple
事先做好的表表对得上,有风险
密码相同,所以哈希一样

把盐关掉、打开比一比。关掉时相同的密码得出相同的哈希;打开后相同的密码哈希也不同,事先做好的表就对不上了。

一打开盐,原本相同的两个哈希就分成了不同的值,事先做好的表也对不上了。小小的一撮盐,一下子挡住了两件事:从存下的哈希看出谁的密码相同,和用表反查常见密码。
不过,盐并不能挡住一切。攻击者仍可以盯住某一个人,把他的盐接到常见密码上,一个个去试。所以盐要和故意算得很慢的哈希、不容易被猜到的长密码一起用。

05

小结

归纳起来是这样:相同的密码得出相同的哈希,所以能从存下的哈希看出谁的密码相同,也能用事先做好的表反查常见密码。要防住这些,就给每个人生成不同的随机盐,接到密码上再做哈希。
盐不是秘密,只要每个人不同就行。加了盐,相同的密码哈希也不同,事先做好的表就失效了。

依次点要点回顾一下

依次点要点回顾一下。(相同密码相同哈希 → 事先做好的表的危险 → 给每个人加盐 → 相同密码也是不同哈希)

现在你知道了,相同的密码为什么是个陷阱,一撮盐又是怎样堵住它的。不必藏起新的秘密,只要让每个人的值不一样,防线就更牢固了,这一点很有意思。
到这里,我们看的都是怎样安全地保存密码。可只靠一个密码来证明“我是我”,够吗?下一课讲认证,介绍除了密码以外,证明本人身份的多种办法。密码只是“你知道的东西”,此外还有“你拥有的东西”和“你自身的特征”。

一句话总结相同的密码会得出相同的哈希。所以光看存下的哈希就能知道谁用了同一个密码,还可能有人用事先写好常见密码和哈希的表,查出原来的密码。防的办法,是给每个人生成不同的随机值,接到密码上再做哈希,这个值就叫盐。盐不是秘密,跟哈希一起存着,只要每个人不同就行。加了盐,相同的密码哈希也不同,事先做好的表就对不上了。不过它挡不住盯住一个人、把密码一个个去试的攻击,所以还要和慢速哈希、长密码一起用。
← 安全
如果有帮助,请支持我们