seegongsik
我的单词本
安全

变成回不去的样子,哈希

把水果放进搅拌机一打,出来的是果汁。光看果汁,没法准确还原放进去的是什么水果。安全哈希也是这样。喂进去一个值,出来一段短短的指纹,可你从那段指纹回不到原来的值。所以我们不把密码原样存下来,只存这段回不去的指纹。

01

只朝一个方向走

想象一个工具,你喂进去一个值,
出来一段短短的、长度固定的指纹。
这个工具叫安全哈希。
喂进同样的值,总是出同样的指纹。
但有一个性质很特别。
从输入做出指纹很容易,
可从指纹回不到原来的输入。
搅拌机能把水果变成果汁,
却没法把果汁变回原来的水果。
所以我们叫它单向。

输入pw-2026
指纹?
把输入变成指纹

用向右的箭头把输入变成指纹。想往左回去,路是堵着的。

往前走的路轻松就开了,
可往回走的路是堵着的。
这道堵就是安全的关键。
因为光凭指纹,没法直接知道原来的值。
那这个性质用在哪里呢?
最常见的地方就是密码。
要是把密码原样存下来,
谁看了存储就立刻知道了。
所以我们改成这样做。

02

存指纹,而不是密码

把密码一字一字存下来很危险,
因为存储一旦泄露,或有人看了,
那个密码立刻就暴露了。
所以我们不存密码本身。
而是把密码送进哈希,
只存出来的那段指纹。
指纹是单向的,
光凭它没法直接知道原来的密码。
就算看了存储,
里面也只是一排回不去的指纹。

密码sun-flower-7
存储里留下的东西...
点两种方式比一比

点一下比较两种方式。明文存储里密码原样可见,指纹存储只留下一段回不去的指纹。

明文存的那边,密码看得清清楚楚。
指纹存的那边,只留下一段读不懂的指纹。
所以论存储,指纹这边安全得多。
但有个疑问冒出来。
要是不存密码,
那用户登录的时候,
怎么确认密码对不对呢?
没有原本可以比对啊。
这里指纹的另一个性质就闪光了。

03

把输入变成指纹来确认

我们说过,同样的值总出同样的指纹。
这个性质就用在确认上。
登录时用户输入密码,
我们把这个输入再送进哈希,
做出一段新指纹。
然后把这段新指纹
跟存好的指纹比一比。
两个一样,就是输入了同样的密码。通过。
两个不一样,就是别的密码。被挡住。
用不着取出原本的密码,
只靠指纹之间相比就完成确认。

选一个输入
存好的指纹a7-c2-90
?
输入的指纹?
选一个输入再点确认

选一个输入再点确认。输入的指纹跟存好的一样就通过,不一样就被挡。

只有输入对的密码时,指纹才一样,才通过。
别的值变成别的指纹,就被挡住。
就这样不存原本,
也能分出对还是错。
存只存指纹,确认就比指纹。
单向这一个性质,
让存储和确认都变得安全。
不过我们在别的单元里
也听过哈希这个词。
那个哈希和这个哈希一样吗?

04

跟 data 的哈希,目的不同

在 data 单元里我们也见过哈希。
那里把值变成格子号,
是为了快快找到想要的资料。
目的是飞快地定个位置。
安全哈希看着样子相似,
目的却正相反。
这里要的不是找得快,
而是让它回不去。
所以安全用的哈希
造得让你很难从指纹回到原来的值。
同一个名字,用法不一样。

点两边对比目的

点两边对比目的。data 哈希为的是快找,安全哈希为的是回不去。

同样是哈希这个词,data 里用它来快找,安全里用它来回不去。目的决定了这工具的性质。

就这样,哪怕是同名的工具,
用在哪里,重要的性质就不一样。
在安全里,回不去这一点
是最宝贵的性质。
现在从头到尾理一遍。

05

来理一理

归成一句话,是这样。
安全哈希把输入变成单向指纹。
从指纹回不到输入。
所以不存密码本身,
只存它的指纹。
登录时把输入再变成指纹,
跟存好的指纹比一比是否一样。
一样就通过,不一样就被挡。
这跟为快找而生的 data 哈希不同,
这是为回不去而生的哈希。
单向指纹、只存指纹、用比较确认。这就是用哈希守护的办法。

依次点四个要点
从上往下依次点下面的要点

依次点要点回顾一下。(单向指纹 -> 只存指纹 -> 用输入的指纹确认 -> 跟 data 哈希目的不同)

现在你知道了,不把密码原样留着,
也能守住它的办法。
一段回不去的指纹,
让存储和确认一起变得安全。
人也好系统也好,都不握着原本,
要丢的秘密就少了。
下回这样守住的信息,
在来回传递的路上怎么安全地搬运呢?
咱们接着一起看下去。

一句话总结安全哈希只朝一个方向把输入变成指纹。从输入到指纹很容易出来,但从指纹回到输入做不到。所以我们不把密码原样存下来,只存它的指纹。就算存储泄露了,里面也只有指纹,原来的密码没法直接知道。登录时,把输入的值再变成指纹,跟存好的指纹比一比是否一样。一样就通过。同样的输入总是出同样的指纹,所以这个比较行得通。这跟我们在 data 里见过的哈希样子相似,但目的不同。data 的哈希是为了快快找到,而这里的安全哈希是为了回不去。单向指纹、只存指纹、用比较确认。这就是用哈希守护的办法。
安全
如果有帮助,请支持我们