与所有的最近的(如LinkedIn)密码的讨论,我期待在密码哈希实现。 咖啡和早读两杯后,我不再是一个译电员比当我开始。 我真的不想假装我。
具体问题
不使用整数唯一的用户ID失败作为有效盐? (隐窝()仅使用16位?)
如果我只是直到第二用完这是否战胜蛮力攻击反复执行SHA256()上的哈希?
如果我要问这些问题我应该使用bcrypt?
讨论/说明:
我们的目标是简单的,如果我的用户的哈希密码被泄露他们:
- 不会是“容易”破解,
- 破解一个密码不会暴露在使用相同密码的其他用户)。
我读过的#1是哈希计算一定是昂贵的 - 回吐,说,一两秒钟来计算,也许需要一点或内存(以挫败硬件解密)。
bcrypt有这种内置的,和scrypt,如果我理解正确的话,更多的是面向未来的,包括最小的内存使用需求。
但是,这是一个同样有效的方法吃的“老调重弹” SHA256的结果时间()作为根据需要多次使用了几秒钟,然后存储最终循环计数与哈希后检查提供的密码?
#2,使用每个密码独特的盐是很重要的。 什么是没有明确是盐必须如何随机的(或大)会。 如果目标是避免大家使用“输入mypassword”作为自己的密码从具有相同散列是不够的,只是做到这一点?:
hash = sha256_hex( unique_user_id + user_supplied_password );
甚至这一点,虽然我不知道它给我买了什么:
hash = sha256_hex( sha256( unique_user_id ) + user_supplied_password );
唯一的好处,我可以从使用用户的ID看,除了我知道它是独一无二的,是避免其沿保存盐与哈希值。 没有太多的优势。 是否有使用用户的ID作为盐真正的问题? 这岂不是完成#2?
我认为,如果有人可以偷我的用户的哈希密码,然后我必须承担起他们能得到他们想要的 - 包括生成散列的源代码。 那么,有没有散列之前增加一个额外的随机字符串(相同的字符串)的密码任何好处? 那是:
# app_wide_string = one-time generated, random 64 7-bit *character* string.
hash = sha256_hex( unique_user_id + app_wide_string + user_supplied_password );
我所看到的建议,但我不明白我从获得对每个用户的盐。 如果有人想暴力破解攻击,他们会知道“app_wide_string”和使用,运行他们的字典攻击的时候,对不对?
是否有一个很好的理由在我自己的滚动如上所述使用bcrypt? 也许是事实,我问这些问题是有足够的理由?
顺便说一句 - 我只是计时现有的哈希函数我已经和我的笔记本电脑,我可以产生约7000哈希第二。 这并不是说经常建议颇有一两秒钟。
一些相关链接:
使用SHA256散列(hashing),并与用户的ID盐析
SHA512与Blowfish和Bcrypt
什么是用户密码盐的最佳长度?