3

我试图对此进行研究,但仍有一些问题没有得到解答。我正在研究如何将 8 个字符的密码变成高位加密密钥。在我的研究过程中,我发现了一些关于盐值的文章。

假设您可以使用所有 256 个字符,那么 8 个字符的密码将是 64 位长。所以,剩下的 64 位只是一个盐值。而且,如果我错了,请纠正我,但是这样做是为了如果有人要尝试尝试所有可能的值(蛮力),他们将不得不尝试所有 128 位,因为即使是盐也是未知的。

我的问题确实与这个“盐”值有关:

  1. 当有人提出申请时,盐值是否被硬编码到其中?如果是这样,它不能通过对可执行文件进行逆向工程来获得吗?
  2. 如果盐是随机生成的,那么我认为它必须有某种方法来复制它。那么,返回随机盐的那个函数不是能够被逆向工程以强制它复制自身以获得盐值吗?
  3. 这可能超出了范围,但是如果在服务器端(客户端/服务器关系)生成盐值,那么它是否必须与客户端共享,以便他们可以解密服务器发送的数据?而且,如果它被发送到客户端,它不能被拦截,这使它无用吗?
  4. 除了这个“盐”值之外,是否还有其他方法可以将 8 个字符的字符串转换为强加密密钥?
4

5 回答 5

5

与安全相关的问题一样,这个答案会很长。

首先,简单的答案。
问:如何将 8 个字符的字符串转换为 128 位的密钥?
A:一个没有。

这是一个真实的答案。现在,更适合您的要求:
A:创建一个随机的64 位值,并将其与密码一起存储在数据库中。现在,密码是密钥的一半,而随机值是另一半。

这是一个谎言。以下是您实际执行的操作:
A:使用产生 128 位或更长输出的方法对密码和随机盐进行哈希处理。使用其中的 128 位作为密钥。储存盐。

现在来解决你关于盐的问题。首先,盐的目的并不是真正延长加密密钥。这是为了防止人们建立彩虹表——从散列到未散列形式的映射。要查看您的加密没有更强,请想象攻击者知道您的密钥扩展算法。现在,他不再猜测 128 位密钥,而是猜测您的 64 位密码,然后使用相同的算法。瞧。如果攻击者不知道盐,是的,你已经获得了一点,但他们必须已经有了你的密文才能攻击它们,并且盐必须与密文一起存储在明文中。所以这是一个不太可能的情况。

  1. 每个加密密钥的盐是随机的。
  2. 随机意味着随机。如果您在使用假定不可预测材料的加密算法时不够随机,那么您很容易受到攻击。这就是/dev/random目的 - 系统熵池非常好。如果您担心,请获得更好的硬件 RNG。
  3. 是的,如果您对密钥进行了加盐,那么有人需要加盐来解密您使用加盐密钥的散列值加密的内容。不,发送盐不一定会损害您的数据;仅将盐发送给已证明他们已经拥有密码的人,但它存储在密文旁边的数据库中。如上所述,有人需要盐和密文来发起攻击。同样,盐的目的不是提高加密强度,它只是为了防止对您的哈希进行预计算攻击。
  4. 有密钥扩展的方法。但是,从根本上说,您的保护仅与其最薄弱的环节一样强大,因此要提供 100% 牢不可破的加密,您将需要一次性密码(一个真正的随机密钥,只要要加密的数据)。在现实世界中,通常所做的是将密码与盐一起散列以产生不可预测的更长的密钥材料。
于 2010-07-27T20:03:07.400 回答
3

将密码或密码短语转换为加密密钥的函数称为密钥派生函数(这可能有助于您搜索有关该主题的更多信息)。此类函数采用密码和随机生成的盐,并通过故意计算密集型的过程生成密钥。要复制该密钥,您必须同时拥有密码盐 - 所以您是正确的,盐必须与加密数据一起存储或传输。

密钥派生函数使用盐的原因是为了增加任何攻击者的工作因素。如果不使用盐,那么给定的密码将永远只产生一个密钥。这意味着攻击者可以轻松地创建一个密钥字典——他的字典中的每个单词都有一个密钥。另一方面,如果使用 64 位 salt,则每个密码可以产生 ~2**64 个不同的可能密钥,这会将字典的大小扩大相同的因子。这基本上使得提前制作这样的字典变得不可能。相反,攻击者必须等到他看到盐值,然后开始生成密钥进行测试。由于密钥派生函数的计算量很大,因此速度很慢,而且他无法在合理的时间范围内深入了解他的字典。

于 2010-07-30T13:41:36.380 回答
1

1)每个密码的加盐方式不同,加盐与散列一起存储。

2) 已存储。

3)不,客户端从不解密任何东西。它发送密码,服务器对其进行加盐、散列和比较。

4) 是的,我会添加一些链接。

于 2010-07-27T19:55:23.563 回答
0
  1. 盐通常不是硬编码的,但它们是随机生成的,通常是在服务器端,并且从不与用户通信。

  2. 盐将存储在数据库中,与密码分开。这个想法是,即使密码哈希数据库被盗,也很难获得实际密码(你必须尝试很多组合),而没有盐。盐是随机生成的,并且对每个用户都不同,所以即使你找到了一个,你仍然需要找到所有其他的。

  3. 盐永远不会被发送,因为客户端永远不会解密任何东西。客户端向服务器发送密码,服务器添加盐(为每个用户随机生成和存储,用户永远不知道)。

所以基本上这就是发生的事情。

注册时:

  1. 用户向服务器发送密码。
  2. 服务器向密码添加随机盐,然后对其进行哈希处理。
  3. salt 和最终哈希值存储在不同的表中。

登录时:

  1. 用户向服务器发送密码。
  2. 服务器获取存储的哈希,并将其添加到密码中。
  3. 服务器散列密码和盐。
  4. 如果最终哈希与数据库中的哈希匹配,则用户已登录。
于 2010-07-27T20:04:37.293 回答
0

...除了这个“盐”值之外,还有其他方法可以将 8 个字符的字符串转换为强加密密钥吗?

对,但是...

您可以计算该 8 个字符的字符串的哈希值:

例如,如果您需要 256 位密钥:

key-256bit = hash(8-character string) //使用 SHA-256 - 非常安全 key-128bit = hash(8-character string) //使用 MD5 不再被认为是安全的

“变成强加密密钥?” 关于强......取决于你需要它有多强,因为如果你只使用一个 8 个字符的字符串,这意味着你只能创建 2^8=256 个不同的哈希值,这很容易暴力破解!

结论:盐会很有价值!

干杯

丹尼尔

于 2010-07-28T08:58:25.340 回答