我看有些文章说 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 不需要入库。
如果确实这是这样,大家认为这两种做饭各有什么优缺点?
1
lostpg 2022-04-13 13:18:03 +08:00 via Android
把明文密码哈希作为盐和不存盐是两回事,不保留盐的话以后验证密码时盐靠猜的话,那算力怕不是很够用...
|
2
rekulas 2022-04-13 13:21:33 +08:00
不清楚他具体算法,但如果是根据明文计算的话-那这种盐也只能防止彩虹表,定向爆破难度会降低,安全性更弱
aes 的做法是盐随机生成放到密文里面,所以每次生成密文都可以不一样但又不需要单独保存盐-但是同上也只能防止彩虹表爆破防不了定向 |
3
0o0O0o0O0o 2022-04-13 13:27:35 +08:00 via iPhone
|
4
R18 2022-04-13 13:33:42 +08:00
他就是把 salt 放到加密好的密文里,每次解密的时候先从密文读取 salt 。这本质上还是存储了 salt 啊。
|
5
jimages 2022-04-13 13:34:02 +08:00
bcrypt 的 salt 存在密文里面的。当 check 的时候,会从密文中取出 salt 和 cost 参与计算。
|
7
lovelylain 2022-04-13 13:43:59 +08:00 via Android
相同密码用 bcrypt hash 两次结果不一样,显然是把盐存在了结果里
|
8
night98 2022-04-14 11:24:00 +08:00
bcrypt 是方便开发者,盐直接放到生成的结果里了,用这种密码加密算法主要是为了防止脱裤后人家暴力破解计算用户的密码
|