加密:如何将8个字符的字符串转换为128位密钥,256位密钥等?

时间:2010-07-27 19:52:08

标签: encryption cryptography salt

我试图对此进行研究,但仍有一些问题没有得到解答。我正在研究如何将8个字符的密码转换为高位加密密钥。在我的研究过程中,我找到了可以谈论盐价值的文章。

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

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

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

5 个答案:

答案 0 :(得分:5)

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

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

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

这个是谎言。这是你实际做的事情:
答:使用产生128位或更长输出的方法将密码与随机盐一起散列。使用128位作为密钥。储存盐。

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

  1. 每个加密密钥都是随机的盐。
  2. 随机意味着随机。如果在使用假设不可预测的材料的加密算法时您的随机性不足,则您很容易受到攻击。这就是/dev/random的用途 - 系统熵池非常好。如果你担心,可以获得更好的硬件RNG。
  3. 是的,如果你腌制了密钥,有人需要盐来解密你使用盐渍密钥的散列值加密的东西。不,发送盐并不一定会损害您的数据;只将盐发送给已证明已拥有密码的人,但它存储在密文旁边的数据库中。如上所述,有人需要盐和密文才能发动攻击。同样,salt的目的是来提高加密的强度,它只是为了防止对哈希的预计算攻击。
  4. 有密钥扩展的方法。但是,从根本上说,你的保护只是它最薄弱的环节,所以为了提供100%不可破解的加密,你需要一个一次性垫(一个真正的随机密钥,只要数据是加密)。在现实世界中,通常做的是将密码与盐一起散列以产生不可预测的更长的密钥材料。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

2)它已存储。

3)不,客户从不解密任何东西。它发送密码,服务器盐,哈希并进行比较。

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

答案 3 :(得分:0)

  1. 盐通常不是硬编码的,但它们是随机生成的,通常是服务器端生成的,并且从不与用户通信。

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

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

  4. 基本上这就是发生的事情。

    注册时:

    1. 用户向服务器发送密码。
    2. 服务器向密码添加随机盐,然后对其进行哈希处理。
    3. salt和final哈希存储在单独的表中。
    4. 登录时:

      1. 用户向服务器发送密码。
      2. 服务器获取存储的哈希值,并将其添加到密码中。
      3. 服务器哈希密码和盐。
      4. 如果最终哈希值与数据库中的哈希值匹配,则会记录该用户 英寸

答案 4 :(得分:0)

...除了这个'salt'值之外还有其他方法可以将8个字符的字符串变成强加密密钥吗?

是的但是......

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

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

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

“成为强大的加密密钥?”关于强大......取决于你需要它有多强大,因为如果你只使用一个8个字符的字符串,那就意味着你只能创建2 ^ 8 = 256个不同的哈希值,这对于暴力来说是一个简单的任务!!

结论:盐很有价值!

欢呼声

丹尼尔