0

如果之前已经回答过这个问题,我深表歉意,但我找不到任何东西。这个问题的灵感来自对 SO 上另一个与安全相关的问题的评论:

如何生成用于散列的随机长盐?

具体评论如下(已接受答案的第六条评论):

...其次,更重要的是,这将只返回十六进制字符 - 即 0-9 和 AF。它永远不会返回高于 F 的字母。当可能存在(并且几乎可以肯定存在)许多其他有效字符时,您将输出减少到仅 16 个可能的字符。

– AgentConundrum 2012 年 10 月 14 日 17:19

这让我开始思考。假设我有一些任意系列的字节,每个字节随机分布在 2^(8) 上。让这个键是 A。现在假设我将 A 转换为它的十六进制字符串表示,键 B(例如 0xde 0xad 0xbe 0xef => "deadbee f")。

有些事情是显而易见的:

  • 长度(B)= 2 长度(A)
  • B 中的符号限制为 2^(4) 个离散值,而 A 中的符号范围超过 2^(8)
  • A 和 B 代表相同的“数量”,只是使用不同的编码。

我的怀疑是,在这个例子中,这两个密钥最终会同样安全(否则每个密码破解工具只会将一种表示转换为另一种表示以进行更快的攻击)。然而,在这个人为的例子之外,我怀疑有一个重要的安全道德可以从中删除。尤其是在选择随机源时。

所以,简而言之,从安全的角度来看,哪个更可取:更长的密钥或值覆盖更多离散符号的密钥?

我对这背后的理论真的很感兴趣,所以对于任何能够提供结论背后的数学/证据的人来说,额外的金星(或者至少是我不朽的钦佩)。

4

2 回答 2

2

如果密码中可用的不同符号的数量是x,长度是y,那么可能的不同密码的数量(以及因此针对暴力攻击的强度)是x ** y。所以你想最大化x ** y。添加x或添加都y可以做到这一点,哪一个使总数更大取决于所涉及的实际数字以及您的实际限制是多少。

但一般来说,增加x只会产生多项式增长,而增加会y产生指数增长。所以从长远来看,长度胜出。

于 2013-06-18T21:36:32.733 回答
1

让我们从长度为 8 的二进制字符串开始。可能的组合是 00000000 和 11111111 的所有排列。这为我们提供了 2^8 的键空间,或 256 个可能的键。现在让我们看看选项A:

A:增加一位。我们现在有一个 9 位字符串,因此可能的值介于 000000000 和 111111111 之间,这给了我们 2^9 或 512 个键的键空间大小。但是,我们也有选项 B。

B:向键空间添加一个附加值(不是键空间大小!):现在假设我们有一个三进制系统,其中接受的数字是 0、1 和 2。仍然假设长度为 8 的字符串,我们有 3^ 8 或 6561 键……显然要高得多。

然而!三位一体不存在!

让我们看看你的例子。请注意,我将澄清其中的一些内容,您可能对此感到困惑。以 4 字节(或 32 位)位串开头:11011110 10101101 10111110 11101111(顺便说一句,这相当于 0xDEADBEEF 的位串)

由于我们每个数字的可能值是 0 或 1,我们的指数的底是 2。由于有 32 位,我们有 2^32 作为这个密钥的强度。现在让我们看看你的第二个键,DEADBEEF。每个“数字”可以是 0-9 或 AF 之间的值。这给了我们 16 个值。我们有 8 个“数字”,所以我们的指数是 16^8...也等于 2^32!所以这些键的强度是相等的(而且,因为它们是相同的东西)。

但我们谈论的是真正的密码,而不仅仅是那些愚蠢的二进制小东西。考虑一个只有长度为 8 的小写字母的字母密码:我们有 26 个可能的字符,其中 8 个,所以强度为 26^8,或 2088 亿(暴力破解大约需要一分钟)。将一个字符添加到长度会产生 26^9,或 5.4 万亿个组合:20 分钟左右。让我们回到我们的 8 字符字符串,但添加一个字符:空格字符。现在我们有 27^8,也就是 2820 亿......比添加一个额外的字符要少得多!

正确的解决方案当然是两者都做:例如,27^9 是 7.6 万亿个组合,或者大约半小时的破解。使用大写、小写、数字、特殊符号和空格字符的 8 字符密码将需要大约 20 天才能破解......仍然不够强大。添加另一个字符,它是 5 年。

作为参考,我通常将密码设置为 16 个以上的字符,并且它们至少有一个大写字母、一个空格、一个数字和一个特殊字符。这样一个 16 个字符的密码将需要数(百)万亿年才能破解。

于 2013-06-18T22:04:39.980 回答