【问题标题】:Encryption: How to turn an 8 character string into a 128-bit key, 256-bit key, etc?加密:如何将 8 个字符的字符串转换为 128 位密钥、256 位密钥等?
【发布时间】:2011-03-21 19:34:26
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: encryption cryptography salt


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

      • 3) 你不用salt加密或解密,你用hash。
      • @Steven Sudit:我想我在你评论之前编辑了这个; “您使用加盐密钥加密”是指“使用加盐密钥的一部分散列值加密”。我会再次澄清。
      • 它仍然具有误导性。 Salt用于散列,而不是加密或解密。如果没有蛮力,就无法从哈希和盐中恢复密码。
      【解决方案3】:

      ...除了这个 'salt' 值之外,是否还有其他方法可以将 8 个字符的字符串转换为强加密密钥?

      是的,但是...

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

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

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

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

      结论:盐会很有价值!

      干杯

      丹尼尔

      【讨论】:

      • 8 个字符不是 2^8 种可能性。对于真正的任意字节,8 个字节是 2^64。对于普通的字母字符,它是 52^8。这是超过 256 种选择的公平份额:-P。
      【解决方案4】:
      1. Salt 通常不是硬编码的,而是随机生成的,通常是在服务器端生成的,并且从不与用户交流。

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

      3. 从不发送 salt,因为客户端从不解密任何内容。客户端发送密码给服务端,服务端加盐(为每个用户随机生成并存储,用户永远不知道)。

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

      注册时:

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

      登录时:

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

      【讨论】:

      • 2) 盐通常与哈希一起存储。它们仅用于防止彩虹表。
      • 作为后续,考虑攻击不需要登录的盐或密码,只需要哈希。
      • 2) 我不完全确定为什么 Wikipedia 说它们通常是单独存储以提高安全性……猜猜这是 Wikipedia 错误的情况之一。另外......为什么只有哈希就足够了?服务器不会只接受哈希登录,它需要一个密码,然后它可以哈希。
      • 维基百科错了很多。在回答您的问题时,请考虑以下方案:Web 服务器通过 HTTPS 接收明文密码并查找用户的 salt。它将它们组合起来并生成一个哈希。然后它将散列值与每个请求一起传递给应用程序服务器。应用程序服务器根据数据库检查它。好处是Web服务器不必保留明文密码只是为了继续将其提供给应用程序服务器,并且应用程序服务器不必维护状态,尽管它确实缓存。不过,攻击者可以只使用哈希来攻击应用服务器。
      【解决方案5】:

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

      2) 已存储。

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

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

      【讨论】:

      • has 的大小与密码和盐的大小无关。例如,SHA-1 总是产生一个 160 位的散列。
      • 散列不是加密,因为你不能(除了对短字符串的彩虹表攻击)恢复原始数据。
      • 除非我误解,否则 OP 询问的是从密码短语生成加密密钥,而不是关于散列和存储密码。
      猜你喜欢
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      相关资源
      最近更新 更多