语言是否重要,德语,法语,意大利语或西班牙语中每个单词的平均熵是否与英语中的平均熵显着不同?
数字是否总是具有$ \ log_2(10)= 3.321928 $的熵?
#1 楼
熵是密码本来可以用来衡量的,因此它实际上与密码本身无关,而是与选择过程有关。攻击平均需要$ S / 2 $的猜测。这里的“平均”是一个重要的词。我们假设“最佳攻击者”了解什么密码比其他密码更可能被选择,并且将从最可能的密码开始进行猜测攻击。该模型如下:我们假设密码是通过计算机上的程序生成的;该程序纯粹是确定性的,并使用具有加密功能的PRNG作为Alea的来源(例如,在Linux系统上为/dev/urandom
,在Windows上为CryptGenRandom()
)。攻击者拥有该程序源代码的副本;攻击者没有的是PRNG实际产生的随机位的副本。如果选择过程的随机部分是统一的(例如,使用骰子或计算机,则很容易计算出熵)良好的PRNG,而不是人类的脑袋里有一个“随机”的机会)。例如,如果您有2000个单词的列表,并从中选择一个(统一),则熵为$ S = 2000 $。熵通常用比特表示:$ n $比特的熵是从一系列均匀且彼此独立选择的$ n $比特序列中得到的(例如,通过为每个比特翻转硬币);它是一个简单的对数标度:“ $ n $比特的熵”表示“熵是$ S = 2 ^ n $”(然后攻击成本平均为$ 2 ^ {n-1} $)。
如果您将密码看作是彼此独立选择的两半,那么总熵就是每一半熵的乘积。当用位表示时,它成为一个和,因为对数就是这样:它们将乘法转换为和。因此,如果您从2000个列表中随机且独立地使用两个单词(即,即使两个单词结果相同,也不要排除任何组合),则总熵为$ 2000 \ cdot2000 = 4000000 $。以位表示,每个词表示约11位的熵(因为$ 2 ^ {11} $接近$ 2000 $),总熵接近22位(并且实际上$ 2 ^ {22} $接近)到$ 4000000 $)。
这回答了您有关数字的问题:十进制数字的熵为10,只要它是随机且统一且独立于密码的所有其他随机部分选择的。由于$ 10 = 2 ^ {3.321928 ...} $,那么每个数字都会为熵增加大约3.32位。
如果人类参与选择过程,那么计算熵就变得更加困难。例如,如果一个人选择两个数字,而第一个数字为“ 4”,则第二个数字为“ 2”的概率就大大高于$ \ frac1 {10} $。可以说,对于攻击者来说,这也很困难:他还将做更多的工作来对潜在的密码进行排序,以使他从最有可能的情况开始。但这是一个心理问题,攻击者尝试对用户的思维过程进行建模,而我们尝试对攻击者的思维过程进行建模:将很难以任何适当的精度量化事物。
评论
$ \ begingroup $
那么,您是说符号的位置对符号包含的熵量没有影响吗?
$ \ endgroup $
–this.josh
11年8月11日在21:26
$ \ begingroup $
符号本身不包含熵:熵是符号生成方式的一种属性-生成过程会生成符号的有序序列。位置是所生成内容的一部分。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
11年8月11日在21:29
$ \ begingroup $
也许你可以这样说:从某些政党的角度来看,熵是存在的。对于知道密码的用户,密码的熵为零。但是通常我们正在讨论熵的一方是一些假设的攻击者。如果您一次给他显示密码一个符号,那么当他看到每个符号依次到达时,他会学到多少新信息(以位为单位)?因此,熵是关于密码的生成,因为我们希望攻击者知道该生成过程的方法而不是值。
$ \ endgroup $
–沼泽雷
2011年8月11日在22:02
$ \ begingroup $
@Chiramisu实际上,当前的英语中大约有171476个单词(至少可以这样说,牛津英语词典的维护者)。假设目标以完全均匀的随机性选择了这些单词之一,则熵为171476,即约17.39位。实际上,人类用户会丢弃他们不记得其拼写的单词,因此实际的熵可能会更低。但是,熵不能更大。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
17年9月11日在17:35
$ \ begingroup $
@ThomasPornin啊,的确如此!我一直在寻求最好的案例,包括所有科学,医学,法律,语,过时等等,但不用担心。通过该数学运算,即使是一百万个单词,熵也仍然只有约19.93位。但是,通过使用至少三个牛津英语单词,我们可以将其增加到〜69.55位,并获得相当好的安全性,大约需要27.4年的时间才能猜出每秒1万亿次的猜测。对于严格的小写字母来说还不错:) ...或10天,每秒1 Quadrillion猜测。 >。<
$ \ endgroup $
– Chiramisu
17年9月11日在18:25
#2 楼
信息熵与相同信息的“可预测性”密切相关。当我们谈论密码熵时,我们通常关心的是密码破解软件预测密码的难易程度。在猜测密码之前,软件必须尝试的密码越多,熵就越大。它是免费的,您可以免费下载20种不同语言的单词列表(以回答有关不同语言的问题)。
使用此熵概念,很容易看到中间的一个数字一个单词的熵可能比单词末尾的数字更大。 John将在尝试的早期尝试单词+ 1到2位数字的组合,因此诸如crypto5之类的信息熵比cryp5to少,并且使用相同的字符。
评论
$ \ begingroup $
那么,基于攻击者在该位置尝试尝试此类符号的可能性,符号的位置会影响符号的熵吗?
$ \ endgroup $
–this.josh
11年8月11日在20:52
$ \ begingroup $
@ this.josh如果您期望攻击者期望您使用某些职位比其他职位更多,那么可以。这是否是一个很好的期望,是一个有趣的讨论。据说有一个政府机构使用密码限制:“如果只有一个字母或特殊字符,则不应是第一个字符或最后一个字符”。不久前,我在extendedsubset.com/?p=18上写了一篇博客文章。
$ \ endgroup $
–沼泽雷
2011年8月11日在22:11
#3 楼
基本上,任何密码都是一串字母,可以很容易地计算出熵。例如,您可以使用Shannon熵计算器,也可以使用科学计算器手动计算。熵是根据密码中字母的频率来计算的,它并不关心所使用的语言。因此,最好使用具有许多不同字母的多种密码,因为熵会更大。如果单词的使用字母比例相同,例如,英语“ and”和印度尼西亚语“ dan”具有相同的熵)。这与Paulo先前所说的相反,这意味着'cryp5to'和'crypto5'具有相同的熵,熵并不关心字母顺序。如果您不相信这一点,请在http://www.shannonentropy.netmark.pl中输入类似的示例来自己尝试。一个随机字符串(大多数人会这样做),他将使用字典来破解您的密码,并且会更早地破解它,但是他知道您使用单词而不是随机字符串,实际上是减少熵的信息,因此他使用了外部信息降低打破它所需的熵。
“该部分的熵是否取决于存在的英语单词的数量,...”
否,它取决于可以根据密码长度和长度进行的所有组合多样性。
“ ...选择算法已知的英语单词数量...”
它可能会影响算法,但不会影响熵,例如如果该算法是:仅尝试字典中没有crypto5但存在crypto的所有单词,它就会失败,但是如果算法更聪明,例如从字典中取出所有单词,然后用随机字母或数字对其进行变异它将最终找到crypto5。
“ ...攻击者使用的英语单词数量?
它可能会影响算法,但从熵的角度来看并不会(请参阅上文),并且请记住,您不知道将如何以及如何破解您的密码,因此您无法假设我会使用其他语言,因为它包含更多单词,但另一方面,如果字母更多(您将在密码中使用它们),则可以使用其他语言。
”这与语言有关,是每个单词在德语,法语中的平均熵,意大利语或西班牙语与英语的平均熵明显不同?”
您可以计算不同语言的熵(实际上,这是Shannon所做的),但同样不会影响密码的熵。
“数字是否总是具有$ \ log_2(10)= 3.321928 $的熵?”
不,基数2是最常见的,它对数字没有任何作用,也可以用于字母或任何其他符号,请参见Wikipedia [信息论熵]
评论
$ \ begingroup $
问题的内容是面对攻击时的密码,这在Thomas的回答中很好地涵盖了。如熵(信息论)所述,熵是在概率模型的上下文中定义的。显然,我们应该期望攻击者将使用智能概率模型,因此,确实是这样的情况,英语单词在密码上下文中的有用熵要少于相同字母的不同顺序。除了原始的“香农熵”,我们需要使用更多的假设。
$ \ endgroup $
–nealmcb
2014-12-16 18:11
#4 楼
随机生成的密码的熵基于字符Library
空间(即有效字符的范围),然后基于密码的length
(即密码中字符的总数),并且没有其他限制(即具有即使密码不太可能发生,也会产生包含所有相同字符的密码的随机消息)。 在这种设置中,熵将是
$ log_2 {(Library ^ {length}} $),请参见下面的示例和克劳德·香农的公式。
离散随机变量“ X”的熵“ H”定义为:
$ {\\ H(X)=-
\ sum_ {i = 1} ^ { n}
P(x_i)\ log_b P(x_i)
} $
如果英语单词是助记符,并且表示某些基础索引值或其他代码值,例如ASCII或UTF-8,那么只要它是随机选择的,我认为就没有区别,因为它的熵将完全取决于所选择的单词或字母的范围。尽管用户选择单词与随机选择的字母(从左向右读取时会“碰巧”等于单词)之间存在差异。
这里是有关密码熵的简单说明,并取决于需要测量的内容。让我们首先假设以下两点:
密码具有特定的“长度”(由其
字符数组成,其中某些字符-或全部-可能是
重复/相同和/或连续重复)。
密码中的任何字符都是从单个公共库或唯一字符的“范围”中选择的,并使用加密安全过程随机选择的。
公式:
Log2(可能的组合)=总体密码熵
范围^长度=可能的组合(也可以四舍五入为2 ^密码熵)
Log2(范围)=每个字符的熵
每个字符的熵*长度=总体密码熵
示例测试:
范围= 2048个唯一字符值(或2048个唯一单词)
长度= 12个字符(或12个单词,其中某些或全部可能重复)
可能性= 5444517870735015415415413993718908291383296或2048 ^ 12
总体熵= 132或log2(可能性)
每个字符(或每个单词,如果使用单词,则为熵)= 11或log2(2048)
另一种粗略检查的方法(取决于精度如果处理小数而不是整数结果):2 ^(log2(Range)* Length)==(2 ^熵)
在Python3中:
2**(int(math.log2(2048))*12) == int(2**132)
PS我认为频率分析在以下两种情况下很有用:一)密码确定性地选择了密码而没有加密安全过程,和/或二)库中的字符不是唯一不同的(即存在一个或多个重复项,或者很多字符具有很强的相似性)或库集中其他未知的信息泄漏。
评论
$ \ begingroup $
数学不错,但错过了不是随机序列的密码。考虑频繁的密码列表。按使用频率排序。如果密码在列表的最前面,则不安全。在大多数情况下,使用此类列表可以破解密码。
$ \ endgroup $
– zaph
18-09-24在16:12
$ \ begingroup $
我正在解决这个问题和更重要的一点,即-现在比以往任何时候都更重要的是开始使用随机密码,并且知道给定密码的熵将完全取决于其长度和可使用的字符范围使用的库。即使您自己选择密码,也可以通过首先了解熵的计算方式来提高密码的安全性。
$ \ endgroup $
–史蒂芬·哈扎基斯(Steven Hatzakis)
18-09-24在16:17
$ \ begingroup $
请参阅NIST数字身份准则。而且,人类创建的密码很少是随机的。
$ \ endgroup $
– zaph
18-09-24在16:19
$ \ begingroup $
前几天我只是在看链接!我同意,人类不能随机选择加密安全过程所能达到的程度(即使反复敲击键盘也不是完全随机的)。但是仍然可以采取一些措施,例如在NIST指南中,以及两因素身份验证和混合盐分以及通过各种方法获取熵,以便即使一个密码被破坏,密码仍然可以通过其他熵输入来保护(其中很多其他经过验证的新方法)。
$ \ endgroup $
–史蒂芬·哈扎基斯(Steven Hatzakis)
18-09-24在16:29
评论
强制性XKCD:xkcd.com/936您忘记给出熵的单位了。从理论上讲,您很可能需要“位”,并将其添加将纠正您的问题“数字是否具有log_2(10)位的熵?”只有当您的数字以统一随机的方式从10个可能的数字池中抽取时才这样做,这是不寻常的-即如果数字表示可计数的数量,则前导数字倾向于遵循对数而不是均匀分布。
我认为“熵”为“暴力组合的总数”。显然,这取决于攻击者的假设。密码的熵会根据有关您选择的格式的假设进行更改。