相同密码的陷阱,一撮盐
上一课我们学过,密码不照原样存,而是换成哈希再存。可是如果两个人碰巧用了相同的密码呢? 相同的密码会算出相同的哈希。要是存下来的哈希列表里两个一样的值并排出现,两个人共用一个密码这件事就一目了然了。所以我们需要一种给每个人掺进不同一撮的办法。
相同密码会成为相同哈希
哈希对相同的输入总是给出相同的结果。
正因如此,下次再输入相同的密码时,
才能拿来跟存下的哈希对一对。
可是这个性质有它的阴影。
两个人用相同的密码,
两个人的哈希也会一样地出来。
光看存下来的哈希列表,
要是一样的值并排在一起,
就能知道密码是相同的。
哪怕不知道密码本身,相同这件事也泄露了出去。
把两个人的密码改成相同或不同。一样的话,哈希也会一模一样地并排显示。
选了相同的密码,
两个哈希看起来一模一样。
光凭哈希,相同就立刻显出来了。
这为什么会成问题呢?
我们学过哈希很难倒着还原,
但相同的值给出相同哈希这一点没变。
那么如果有人把常见的密码
事先做成哈希记下来,会怎么样?
事先做好的表为什么危险
常用的密码,种类比想象的要少。
所以可以把这些密码
和它们各自的哈希事先一行行写下来。
手里有这样一张事先做好的对照表,
就能把存下的哈希拿到表里查,
反着把密码猜出来。
这不是去破解哈希本身,
而是跟事先写好的答案对一对。
所以越是常见的密码越危险,
因为它更可能已经在表里了。
点一下存下的哈希。留意一下:要是事先写好的表里有相同的哈希,密码就可能被猜出来。
表里的哈希跟存下的哈希一样时,
它旁边格子里的密码就原原本本露了出来。
表里没有的哈希,猜测就被挡住了。
到这里我们能抓住核心。
风险的根子在于相同的密码
总会成为相同的哈希。
那么防住的路子也看出来了。
只要让相同的密码在每个人那里哈希得不一样,
单凭一张事先做好的表就再也对不上了。
那个办法正是加盐。
给密码加上盐
盐是给每个人定得各不相同的一个小值。
不把密码照原样去做哈希,
而是先把这个人的盐接到密码上。
然后把两者合在一起去做哈希。
要紧的是盐每个人都不同。
盐不是要藏起来的秘密。
把它跟哈希并排存着也没关系,
因为光知道盐,
也没法知道密码。
盐只做一件事:让哈希因人而异。
点一下把每个人的盐加进密码的按钮。先把盐接到密码上,再对这个结果做哈希。
加了盐,喂进哈希的输入本身就变了。
哪怕是相同的密码,
前面接的盐不同,
进哈希的原料彼此就不一样了。
我们学过哈希哪怕输入只差一点,
结果也会完全不同。
所以盐不同,哈希就不能不不同。
现在来直接比一比:两个人就算用相同的密码,
存下的哈希看起来会怎样。
相同密码也成为不同哈希
想想没有盐的时候。
两个相同密码的哈希是一样的。
把盐打开,事情就变了。
两个人的密码就算相同,
盐不同,存下的哈希就彼此不同。
现在就算看存下的哈希列表,
也挑不出谁用了相同的密码。
而且,事先做好的表也变得无力。
那张表是用没加盐的密码的哈希做的,
所以跟掺了盐的哈希对不上。
因为盐因人而异,等于要给每一个人单独做一张表。
把盐关掉再打开比一比。关掉时相同密码相同哈希,打开时相同密码哈希也不同,表就变无力了。
盐一打开的那一刻,
原本相同的两个哈希就分成了不同的值。
事先做好的表也不再对得上了。
小小一撮,一下子解决了两件事。
它既挡住了光凭存下的哈希看出相同密码,
也挡住了用表把常见密码反着找出来。
而且不用新藏什么秘密,
只要加上一个因人而异的值就行。
现在来把整件事理一理。
来理一理
归成一句话,是这样。
相同的密码会成为相同的哈希。
所以存下的哈希能看出共用的密码,
用事先做好的表,常见密码还有被反着找出来的风险。
防住的办法是给每个人不同的盐
加进密码里再做哈希。
盐不是秘密,只要每个人不同就行。
加了盐,相同的密码哈希也全都不同,
表就变无力,相同哈希也不再出现。
用盐解开陷阱,相同密码也成为不同哈希。这就是加盐。
依次点要点回顾一下。(相同密码=相同哈希 -> 事先做好的表的危险 -> 加盐 -> 相同密码也是不同哈希)
现在你知道了相同的密码为什么会成为陷阱,
以及一撮盐
是怎么把那个陷阱解开的。
不用再多藏什么秘密,
只要让东西因人而异,
防御就牢固得多,这一点很妙。
故意制造一点小差异的这个想法,
在安全里会一次次再遇到。
下回这些保护机制
怎么更严密地一层层叠起来呢?
咱们接着一起看下去。