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

标签 encryption cryptography salt

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

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

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

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

最佳答案

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

首先,简单的答案。
问:如何将一个 8 字符的字符串变成一个 128 位的 key ?
A:没有。

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

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

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

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

关于加密:如何将 8 个字符的字符串转换为 128 位 key 、256 位 key 等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3347384/

相关文章:

encryption - 在 exoplayer android 中使用 AES 在线加密流媒体视频文件

python - 找到素数的概率(使用米勒-拉宾检验)

cocoa - 实现与加密一起使用的文件格式 - Cocoa

elasticsearch - 盐的Jinja模板

php - 在 PHP 中根据 SSHA256 哈希验证密码

javascript - TripleDES 在 JavaScript 中加密和解密 - CryptoJS

java - 将 C++ 加密转换为 Java

java - 为什么 AES java 解密返回额外的字符?

haskell - 自定义 ord 和 chr 函数

java - 将 int 转换为 String,然后使用 XOR 对其进行加密