Dav*_*vid 126 encryption hash salt
当盐析和散列用户密码时,任何盐显然都会有所帮助.盐有多长时间有什么最佳做法吗?我将盐存储在我的用户表中,所以我希望在存储大小和安全性之间进行最佳权衡.是一个随机的10个字符的盐吗?或者我需要更长的时间?
Sec*_*Joe 67
大多数这些答案都有点误导,并证明了盐和加密密钥之间的混淆.包含salt的目的是修改用于散列每个用户密码的函数,以便每个存储的密码散列都必须单独攻击.唯一的安全要求是每个用户都是唯一的,没有任何好处是不可预测或难以猜测.
盐只需要足够长,以便每个用户的盐都是独特的.即使有十亿注册用户,随机64位盐也不太可能重复,所以这应该没问题.单独重复的盐是一个相对较小的安全问题,它允许攻击者一次搜索两个帐户,但总的来说不会在整个数据库上加快搜索速度.在大多数情况下,即使是32位盐也是可以接受的,在最坏的情况下,它会使攻击者的搜索速度提高约58%.增加盐超过64位的成本并不高,但没有安全理由这样做.
在每个用户的盐之上使用站点范围的盐也有一些好处,这将防止可能与存储在其他站点的密码哈希冲突,并防止使用通用彩虹表,尽管甚至32位盐足以使彩虹表成为不切实际的攻击.
更简单 - 开发人员总是忽略这一点 - 如果你有唯一的用户ID或登录名,那些服务就像盐一样完美.如果这样做,您应该添加一个站点范围的盐,以确保不与具有相同好主意的另一个系统的用户重叠.
Ste*_*set 24
编辑:我的下面的答案回答了问题,但"真正的"答案是:只使用bcrypt,scrypt或Argon2.如果你问这样的问题,你几乎肯定会使用太低级别的工具.
老实说,没有可靠的理由不让盐与散列密码的长度相同.如果您使用的是SHA-256,那么您将拥有256位哈希值.没有理由不使用256位盐.
从数学角度来说,超过256位不会对您的安全性有任何改进.但是,加入较短的盐可能总会导致彩虹表赶上盐的长度 - 尤其是较短的盐.