我试图对此进行研究,但仍有一些问题没有得到解答。我正在研究如何将8个字符的密码转换为高位加密密钥。在我的研究过程中,我找到了可以谈论盐价值的文章。
假设您可以使用所有256个字符,那么8个字符的密码将是64位长。因此,剩下的64位只是一个盐值。并且,如果我错了,请纠正我,但这样做是为了如果有人试图尝试 ALL 可能的值(暴力)他们必须尝试所有128位自即使是盐也是未知的。
我的问题与这个“盐”值有关:
答案 0 :(得分:5)
与安全相关的问题一样,这个答案将会很长。
首先,简单的答案 问:如何将8个字符的字符串转换为128位密钥? 答:一个没有。
这是一个真实的答案。现在,一个更适合你所要求的东西:
答:创建随机 64位值,并将其与密码一起存储在数据库中。现在,密码是密钥的一半,随机值是另一半。
这个是谎言。这是你实际做的事情:
答:使用产生128位或更长输出的方法将密码与随机盐一起散列。使用128位作为密钥。储存盐。
现在解决你关于盐的问题。首先,salt的目的并不是真正延长加密密钥。这是为了防止人们构建彩虹表 - 从散列到未散列形式的映射。要确保您的加密不强,请想象一下攻击者知道您的密钥扩展算法。现在,他不是猜测128位密钥,而是猜测你的64位密码然后使用相同的算法。瞧。如果攻击者不知道盐,是的,你已经获得了一点,但他们必须已经有你的密文攻击它们,并且盐必须与密文一起存储在平原中。所以这种情况不太可能发生。
/dev/random
的用途 - 系统熵池非常好。如果你担心,可以获得更好的硬件RNG。答案 1 :(得分:3)
将密码或密码转换为加密密钥的函数称为密钥派生函数(这可能有助于您搜索有关该主题的更多信息)。这些函数采用密码和随机生成的盐,并通过故意计算密集的过程生成密钥。要重现该密钥,您必须同时拥有密码和盐 - 所以您是正确的,盐必须与加密数据一起存储或传输。
密钥派生函数使用salt的原因是为任何攻击者增加工作因素。如果没有使用salt,那么给定的密码将只生成一个密钥。这意味着攻击者可以轻松创建密钥字典 - 其字典中每个单词的一个键。另一方面,如果使用64位盐,那么每个密码可以产生~2 ** 64个不同的可能密钥,这扩展了字典的大小相同的因子。这基本上使得提前生成这样的字典是不可能的。相反,攻击者必须等到他看到盐值,然后开始生成密钥进行测试。由于密钥派生函数在计算上很昂贵,因此速度很慢,并且他无法在合理的时间范围内完成他的字典。
答案 2 :(得分:1)
1)每个密码的加密方式不同,盐与哈希一起存储。
2)它已存储。
3)不,客户从不解密任何东西。它发送密码,服务器盐,哈希并进行比较。
4)是的,我会添加一些链接。
答案 3 :(得分:0)
盐通常不是硬编码的,但它们是随机生成的,通常是服务器端生成的,并且从不与用户通信。
盐将存储在数据库中,与密码分开。这个想法是,即使密码哈希数据库被盗,也很难获得实际的密码(你必须尝试很多组合),而不需要盐。盐会随机生成,每个用户都会有所不同,所以即使你发现它们,你仍然需要找到所有其他的。
从不发送salt,因为客户端从不解密任何东西。客户端将密码发送到服务器,服务器添加盐(为每个用户随机生成和存储,用户永远不知道)。
基本上这就是发生的事情。
注册时:
登录时:
答案 4 :(得分:0)
...除了这个'salt'值之外还有其他方法可以将8个字符的字符串变成强加密密钥吗?
是的但是......
您可以计算该8个字符的字符串的哈希值:
例如,如果您需要256位密钥:
key-256bit = hash(8个字符的字符串)//使用SHA-256 - 非常安全 key-128bit = hash(8个字符的字符串)//使用MD5不再被认为是安全的
“成为强大的加密密钥?”关于强大......取决于你需要它有多强大,因为如果你只使用一个8个字符的字符串,那就意味着你只能创建2 ^ 8 = 256个不同的哈希值,这对于暴力来说是一个简单的任务!!
结论:盐很有价值!
欢呼声
丹尼尔