既然我用自己的盐对所有密码进行散列,那么盐是否真的是随机的,或者增量计数器或guid是否足够好?另外,大盐和小盐有好处吗?
编辑:既然已经确定散列不应该太小:什么是足够大小的盐?guid (16字节)可以吗?
发布于 2011-10-19 12:49:09
salt的唯一用途是唯一的:没有两个散列密码使用相同的盐值。这是为了防止成本分担,如预先计算的哈希表。
独特性应该是世界性的。例如,假设您使用一个简单的计数器作为盐。相应地,值"1“将用作第一个创建帐户的salt,可能是服务器管理员的salt。对于该服务器的所有已安装实例,这将是正确的。这使得使用"1“作为salt预计算一个可能的散列密码的大表(例如彩虹台)是值得的,因为该表可用于攻击所有使用该软件的服务器上的管理员密码。在这里冥想这个词是“值得的”。
由于服务器范围的唯一性是不够的,一个计数器是不够的;用户名也不是一个好盐(用户名在给定的服务器上是唯一的,但是有许多'Bob‘、'Joe’和'DarkLord42‘)。UUID (GUID)应该能做到这一点。您也可以使用一个强均匀伪随机生成器(/dev/urandom,CryptGenRandom(),java.security.SecureRandom.根据您使用的平台而定),并从中获取足够多的随机字节,这样重用盐值的风险就足够小了;16个字节就足够了。使用随机性是一种“稳健的方式”,因为它以足够高的概率产生唯一性,而不必依赖于世界范围的惯例。
发布于 2011-10-19 12:16:30
感谢亨德里克对这个问题的评论,我找到了一条与此相关的线索。以下是我的调查结果:
如果每个人(或至少有几个)使用相同的盐类(即。增加数字或短盐),可以为所有重复的盐类创建彩虹表,使那些盐渍散列不那么安全。
因此,盐最好也应该是唯一的系统,而不仅仅是在我的系统内,以避免一组彩虹表要创建和使用,以损害几个系统。(一个表用于salt=1,一个用于salt=2,一个用于salt=3,等等)。
发布于 2011-10-19 12:18:00
盐不一定是随机的,也不是秘密的。它只是用来阻止使用彩虹表的攻击,或者使这种攻击慢得多。如果我没有弄错的话,用他/她的用户名保存用户密码应该是安全的。
https://security.stackexchange.com/questions/8246
复制相似问题