大家一般怎么生成盐的啊。。

2017-12-28 02:02:28 +08:00
 flowfire

nodejs 里用 crypto.randomBytes 生成一个 32 字节的随机数够不够。。
以及密码 hash 就直接用 hamc(password, salt) 么 = = 啥算法比较好.。。sha256 够么= =

15351 次点击
所在节点    程序员
65 条回复
ThatIsFine
2017-12-28 18:00:15 +08:00
@SingeeKing 就是一定长度的字符串而已, 它自己再怎么算也没多大作用.

创建一般是输入一个口令, 经过加密算法, 再搞一个随机串(盐)合并, 最后再加密, 盐和最后的串存数据库, 每次鉴权会再使用盐和输入算最后的串.
通过彩虹表撞库, 一般是已知算法, 生成数据字典, 去直接撞最后的串.
ligo
2017-12-28 18:06:48 +08:00
酸碱中和
ligo
2017-12-28 18:12:36 +08:00
怎样删除回复??盐只要无法预测就可以了
ligo
2017-12-28 18:26:46 +08:00
我又想了一下,盐可以预测也无所谓,只要每个用户的盐值不同就行
geelaw
2017-12-28 18:32:44 +08:00
@SingeeKing
@ThatIsFine
@flowfire
@suspended

多次 hash 唯一可能增加安全性的可能是让 hash 计算变慢,然而这个和盐没什么关系。而且区区那么几次也没太大作用,我也不太懂为什么他们要,比如,hash 5000 次之类的。
suspended
2017-12-28 18:45:25 +08:00
@geelaw 并没有。实际上是增加了自己系统的计算量,减少了攻击者的计算量,降低了系统安全性的。
geelaw
2017-12-28 18:49:47 +08:00
@suspended 没明白,攻击者拖库之后想要算出一个可以通过系统验证的密码是需要自己算了 hash 的。没有明白这怎么减少了攻击者的计算量。

注意语境:加盐是为了防止拖库之后攻击者能用彩虹表或者频率统计的方法获取密码,这里的手法都是为了阻碍拖库之后得到密码的。
l1093178
2017-12-28 18:51:18 +08:00
每个用户盐不一样,而且盐足够长就行了,对随机性没什么要求...
以及记得选个慢 hash 函数(比如 argon2,scrypt 或者 bcrypt,安全性依序降低),md5 和 SHA 系列 hash 函数都不安全(用 GPU / 专用硬件破解起来很快)

@suspended 然而多次 hash 确实能提高破解的成本,当然新的密码 hash 函数都直接把 cost 设置为 hash 函数的一个参数了。
chinvo
2017-12-28 19:02:44 +08:00
@geelaw 随机输入计算一次,输入是不定长的,但是多次计算,相当于拿最后那个定长字符串去算一次。
msg7086
2017-12-28 19:23:01 +08:00
@geelaw 前提是源码不泄露?

@flowfire 生成随机数直接用语言运行时自带的就好了。
Java 和 Ruby 用 SecureRandom,PHP 可以用 random_bytes 这些。
geelaw
2017-12-28 19:51:44 +08:00
@chinvo #49 并不是这样的,攻击者的目标是找到一个字符串作为密码输入系统的时候可以通过验证,譬如系统要求

hash1(hash2(input)) == saved_hash

并不是说找到了 found=hash2(password) 就可以的——目标是解方程 hash1(hash2(x)) = y,而 x=found 并不是一个解。注意:这两个 hash 都是在服务器算的,在客户端算的已经被建模为 input 了。

@msg7086 #50 不知道您回复的是哪一层,不过无论如何,安全的系统不怕代码泄露。
msg7086
2017-12-28 19:57:40 +08:00
@geelaw 我重新读了 3 遍回复,感觉你,我,和 @suspended 互相有些上下文上的误解……

suspended 同意了你的观点,你反对了他的观点,我同意了 suspended 的观点,然后反对了你的观点,又同意了你之前的观点。
suspended
2017-12-28 20:04:38 +08:00
@geelaw 恩,我的说法不对,没有考虑位数带来的计算量指数级增长,只考虑了 hash 结果的字符集是可预测的范围。
geelaw
2017-12-28 20:09:01 +08:00
@msg7086 #52

我 #31:不需要多次 hash
suspended #37:多次 hash 不能增强安全性(同意我)
我 #45:(回复 #37 )多次 hash **有时**可以通过增加计算 hash 的难度增加安全性,但是这种方法和“盐”的主题没关系
suspended #46:(我认为是回复 #45 )多次 hash 会降低安全性
我 #47:(回复 #46 )没明白 #46
您 #50:(不知道回复哪一层)

我在 #31 表示不需要多次 hash 是说就盐这个机制,而且使用专门设计的慢 hash 更好;此外,我觉得是“保存 100 次”的另一个原因是,我没看出来他们这样做是为了减慢速度,那些发言给我的感觉是单纯觉得多加几次 hash 更难。

完整来说,我的观点:

- 增加(固定次数的) hash 次数等价于改变 hash 函数,并不会让破解更困难(除了可能会让 hash 计算更慢这方面)
- 加盐是为了让每个用户用不同的 hash 函数,从而无效化彩虹表和频率统计
msg7086
2017-12-28 20:12:55 +08:00
@geelaw 你的观点没错。
我是想说多次 hash 只要源码和数据库一起泄露就无效了,不能提高安全性。
你 47 没明白 46,所以我 50 也一眼没看明白 47。
geelaw
2017-12-28 20:16:44 +08:00
@msg7086 但我还是没理解怎么会“降低安全性”。
msg7086
2017-12-28 20:27:41 +08:00
@geelaw

suspended 1 小时 40 分钟前
并没有。 [将专业的加盐 Hash 替换为多次反复计算 Hash,]实际上是增加了自己系统的计算量,减少了攻击者的计算量,降低了系统安全性的。
sgissb1
2017-12-28 20:27:57 +08:00
超市或者小卖铺买一包,接着倒出来,就生成盐了。这是最安全的。

科学宅的做法,一般是买一瓶氢氧化钠,接着买点盐酸,按照一摩尔氢氧化钠和一摩尔盐酸的比例用滴注法一点点的混合,在混合过程中需要用烧瓶作为容器,且需要注意温度变化,带滴注完成后,用玻璃棒轻微的搅拌调匀,即可得到
生成 的氯化钠,也就是我们百姓口中说的不加典食盐的主要成分。
geelaw
2017-12-28 20:29:52 +08:00
@msg7086 get 这个意思了,但是前面反复 hash 很多次的人也都加了盐,所以没想到这个省略的意思。
kmahyyg
2017-12-28 21:03:44 +08:00
python3.6

secrets.token_urlsafe(16)

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

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

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

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

© 2021 V2EX