密码加盐哈希中,盐好像可以不存到数据库吗?

2022-04-13 13:10:43 +08:00
 fstar

我看有些文章说 salt 需要存到数据库。

但有些加密库不需要,比如 bcryptjs 。

https://github.com/dcodeIO/bcrypt.js#usage---sync

用法为:

To hash a password:

var bcrypt = require('bcryptjs');
var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync("B4c0/\/", salt);
// Store hash in your password DB.

To check a password:

// Load hash from your password DB.
bcrypt.compareSync("B4c0/\/", hash); // true
bcrypt.compareSync("not_bacon", hash); // false

Auto-gen a salt and hash:

var hash = bcrypt.hashSync('bacon', 8);

这是什么原理?

我猜它是不是给明文密码又哈希了一次,作为 salt 。因为可以通过明文密码计算出 salt ,所有 salt 不需要入库。

如果确实这是这样,大家认为这两种做饭各有什么优缺点?

2591 次点击
所在节点    编程
8 条回复
lostpg
2022-04-13 13:18:03 +08:00
把明文密码哈希作为盐和不存盐是两回事,不保留盐的话以后验证密码时盐靠猜的话,那算力怕不是很够用...
rekulas
2022-04-13 13:21:33 +08:00
不清楚他具体算法,但如果是根据明文计算的话-那这种盐也只能防止彩虹表,定向爆破难度会降低,安全性更弱

aes 的做法是盐随机生成放到密文里面,所以每次生成密文都可以不一样但又不需要单独保存盐-但是同上也只能防止彩虹表爆破防不了定向
0o0O0o0O0o
2022-04-13 13:27:35 +08:00
R18
2022-04-13 13:33:42 +08:00
他就是把 salt 放到加密好的密文里,每次解密的时候先从密文读取 salt 。这本质上还是存储了 salt 啊。
jimages
2022-04-13 13:34:02 +08:00
bcrypt 的 salt 存在密文里面的。当 check 的时候,会从密文中取出 salt 和 cost 参与计算。
fstar
2022-04-13 13:38:58 +08:00
@jimages 懂了,一个字段存两个字段的内容。
lovelylain
2022-04-13 13:43:59 +08:00
相同密码用 bcrypt hash 两次结果不一样,显然是把盐存在了结果里
night98
2022-04-14 11:24:00 +08:00
bcrypt 是方便开发者,盐直接放到生成的结果里了,用这种密码加密算法主要是为了防止脱裤后人家暴力破解计算用户的密码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/846714

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX