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

m-y*_*m-y 3 encryption cryptography salt

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

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

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

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

Bor*_*lid 5

像往常一样,与安全相关的问题,这个答案将是一个漫长的答案.

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

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

这个是谎言.以下是您实际执行的操作:
A:使用生成128位或更长输出的方法将密码与随机盐一起散列.使用128位作为密钥.储存盐.

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

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