盐是什么?_盐是从哪里来的

(50) 2024-08-20 23:01:03

今天看见一篇帖子

我听朋友说:“加盐可以抵御黑客”,这令我感觉非常疑惑,请告诉我在服务器上撒盐来抵御黑客的原理。还是我理解错误?

我们先来看看各位程序员的调侃回答
盐是什么?_盐是从哪里来的 (https://mushiming.com/)  第1张

盐是什么?_盐是从哪里来的 (https://mushiming.com/)  第2张

盐是什么?_盐是从哪里来的 (https://mushiming.com/)  第3张

下面我们总结一下盐到底是个什么东西。

以下是维基百科的解释:

盐(Salt),在密码学中,是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。
在大部分情况,盐是不需要保密的。盐可以是随机产生的字符串,其插入的位置可以也是随意而定。如果这个散列结果在将来需要进行验证(例如:验证用户输入的密码),则需要将已使用的盐记录下来。

以下是百度百科的解释:

好像百度我没找到。

下面总结一个简单版本,大概原理就是这样:

用户设置密码 abc,如果数据库保存明文 abc,一旦泄露就等于泄露密码,黑客就可以登录。

所以服务器不存密码明文,存摘要的哈希值,比如存 md5(“abc”) 的结果 cd24fb0d6963f7d28e17f72,但登录只接受明文输入,不接受哈希值。

当黑客脱库没拿到明文 abc,只拿到了哈希值 cd24fb0d6963f7d28e17f72,他们就要想办法知道哈希值对应哪个明文。于是他们就穷举出尽可能多字符串的哈希值,做成一个表,叫彩虹表。拿着表逐个去对,哈希值对上了就知道是哪个明文了。

为了防止彩虹表这种激活成功教程方式,于是就有了盐 salt,在摘要的时候加进去,比如 md5(“a 盐 1b 盐 2c 盐 3”),这样一来摘要输入变长了,简单的彩虹表就不够用了,得制作足够大的彩虹表去对,而且就算你对出来了你还要知道哪部分是盐哪部分是真正的密码。

我们的服务器要怎么验证用户的密码是正确的呢?

在添加新用户时,前端会向服务器发送用户名,密码等表单信息,服务器在拿到用户的明文密码后,生成一个或多个随机的字符串,也就是盐(salt), 再将这些盐和密码经过hash算法加密,得到的密文存入数据库,salt也一并存入数据库,下次用户进行登陆时,将用户输入的明文和数据库中存储的salt再以同样的算法进行hash,得到密码,然后和数据库中用户存储的正确的密码的密文进行对比,一致则密码正确。

盐能不能不随机生成呢?

可以,但是不安全。如果盐是固定的,激活成功教程者也已经得到了你的加密算法(能做到脱库,取到你的源代码也可能吧),盐也已经被知道了(盐要不放在源代码里固定的字符串,要不存在数据库),这样一来,就和没加密没区别了,只要进行撞库就行了,所有的密码都被激活成功教程了;如果盐是随机的,每个人的盐都不一样,就算知道了加密算法和盐,要激活成功教程所有的密码,那就得针对每个用户都去建一个彩虹表(因为盐不一样),那复杂度可就高多了。

大概的原理就这么多,更多细节大家可以去搜搜看!

THE END

发表回复