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

Encryption 加密:如何将8个字符的字符串转换为128位密钥、256位密钥等?,encryption,cryptography,salt,Encryption,Cryptography,Salt,我试图对此进行研究,但仍有一些问题没有答案。我正在研究如何将8个字符的密码转换为高位加密密钥。在我的研究中,我发现了一些关于盐的价值的文章 假设您可以使用所有256个字符,那么8个字符的密码将是64位长。因此,剩下的64位只是一个salt值。如果我错了,请纠正我,但这样做是为了,如果有人要尝试所有可能的值(蛮力),他们必须尝试所有128位,因为即使是盐也是未知的 我的问题确实与“盐”的价值有关: 当有人提出申请时,盐值是硬编码的吗?如果是这样,难道不能通过对可执行文件进行反向工程来获得它吗 如果

我试图对此进行研究,但仍有一些问题没有答案。我正在研究如何将8个字符的密码转换为高位加密密钥。在我的研究中,我发现了一些关于盐的价值的文章

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

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

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

    2) 它是储存的

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


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

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

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

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

    这是一个谎言。以下是您实际执行的操作:
    答:使用产生128位或更长输出的方法将密码与随机salt一起散列。使用其中的128位作为密钥。把盐储存起来

    现在来回答你们关于盐的问题。首先,salt的目的并不是真正延长加密密钥。这是为了防止人们构建彩虹表——从散列映射到未散列表单。要想知道您的加密没有更强,只需想象攻击者知道您的密钥扩展算法。现在,他不再猜测128位密钥,而是猜测您的64位密码,然后使用相同的算法。瞧。如果攻击者不知道盐,是的,你已经获得了一点,但是他们必须已经有你的密文来攻击他们,盐必须和密文一起存储在平原上。因此,这是一种不太可能的情况

  • 每个加密密钥的Salt是随机的
  • 随机意味着随机。如果在使用假定材料不可预测的加密算法时,随机性不足,则易受攻击。这就是
    /dev/random
    的用途-系统熵池非常好。如果你担心的话,找一个更好的硬件RNG
  • 是的,如果您将密钥加密,则有人需要使用该盐来解密您使用加密密钥的哈希值加密的内容。不,发送salt并不一定会损害您的数据;仅将salt发送给已证明拥有密码的人,但它存储在您的数据库中的密文旁边。如上所述,有人需要salt和密文来发起攻击。同样,salt的目的是而不是提高加密强度,它只是为了防止对哈希的预计算攻击
  • 有一些密钥扩展方法。但是,从根本上说,您的保护只有其最薄弱的环节那么强大,因此要提供100%不可破解的加密,您需要一个一次性键盘(一个真正的随机密钥,只要数据需要加密)。在现实世界中,通常要做的是将密码与salt一起散列,以生成不可预测的较长键控材料
  • 盐一般不硬编码,但它们是随机生成的,通常是服务器端生成的,并且从不与用户通信

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

  • salt永远不会发送,因为客户端从不解密任何内容。客户端向服务器发送密码,服务器添加salt(为每个用户随机生成和存储,用户永远不会知道)

  • 所以基本上就是这样

    注册时:

  • 用户向服务器发送密码
  • 服务器向密码添加一个随机salt,然后对其进行散列
  • salt和final散列存储在单独的表中
  • 登录时:

  • 用户向服务器发送密码
  • 服务器获取存储的哈希,并将其添加到密码中
  • 服务器对密码和salt进行哈希运算
  • 如果最后的散列与数据库中的散列匹配,则记录用户 在

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

    是的,但是

    您可以计算散列