“最强密码”


11

我有一个受四位数PIN码保护的应用程序,该用户在锁定帐户之前进行了五次登录尝试。

现在,我的一位客户希望“加强”安全性,并提倡另一种解决方案:

  • 六位数密码
  • 否“彼此相邻的相同数字”:例如:11 3945或39 55 94
  • 否“三个运行数字”:例如:123 654或53 789 3

现在开始思考:哪种解决方案最强?

我可以很容易地计算出四位数,但是如何计算另一位数呢?

谢谢!

更新资料

您会得到您想要的-特别是在使用数学时:)

所以,我要的是两个数字序列的组合数。

通读答案和评论,对我来说很清楚,这真的没有关系。如果您有5个猜测,那么有10.000或〜800.000可以选择。更重要的是排除1234和出生日期。在我的情况下,我实际上有用户的出生日期,因此我需要检查一些东西。

感谢您的精彩讨论!


4
从历史的角度来看,您应该熟悉Enigma机器的密码分析。特别是,Enigma算法从不加密给自己的信。工程师认为这可以使其更安全,但是却可以使机器的安全性大大降低。这是允许盟国打破谜团的众多步骤之一。我无论如何都不是加密专家,但一般的想法是您希望您的密钥空间尽可能大。
Sycorax说,恢复莫妮卡

2
我认为这属于密码学,而不是此处。
gung-恢复莫妮卡

2
卡斯珀(Casper),请澄清-您主要是将其视为安全性问题(例如,与考虑因素相关的不仅仅是概率问题),在这种情况下,它可能更适合其他地方使用-或者您是在问一个主要的概率问题(适合这里)?
Glen_b-恢复莫妮卡

3
从理论上讲-如果您只专注于暴力攻击-更多可能性意味着更高的安全性,因此诸如无数或无间隔3之类的限制会减少可能性的数量,因此,它们的作用就更弱了。但是,实际上(随着user777的接触),人们并没有选择随机的引脚。如果用户比他们偏执狂更懒惰,他们中的许多人可能会选择“ 000000”或“ 123456”之类的图钉,这会使事情变得不那么安全。
格里戈尔·托马斯

2
我投票(暂时)以不清楚的方式结束这个问题,理由是OP的意图尚不明确。我真的更希望看到@Glen_b的问题得到解答,因此我们知道应该将其视为组合问题/概率问题还是应更好地移植。
银鱼

Answers:


8

您已向统计学家论坛寻求有关此问题的帮助,因此,我将提供基于统计的答案。因此,可以合理地假设您对随机猜出PIN的可能性感兴趣(对于随机性的某种定义),但这对问题的理解超出了所提供的范围。

我的方法是枚举所有可能的选项而不受限制,然后减去void选项。但是,这有一个尖锐的角落,称为“包含-排除”原理,它对应于一个直观的想法,即您不想从集合中两次减去同一事物!

在无限制的六位数PIN和十进制数字系统中,有可能的组合,从000 000999 999 每个数字有10个选项。106000000999999:

考虑一下“两个相邻的相同”数字的样子:,其中标记为A的位置相同,X可以是任何十进制数字。现在考虑以六位数排列字符串A A的其他几种方式:X A A X X XX X A A X XX X X A A XX X X X A AAAXXXXAXAAXAAXXXXX一种一种XXXXX一种一种XXXXX一种一种。因此,对于任何特定的顺序(这些选项之一),至少有组合,因为有10 4个数字不受限制。现在,A有多少种选择?我们正在使用十进制数字,因此必须为10。因此,特定顺序有10 5个选择。有五种这样的排序,因此有5 × 10 5个满足此定义的排列。(这在安全性上的意义可以通过信息理论上的度量来衡量,以多少程度地降低PIN空间的熵。)104104一种1055×105

现在考虑连续数字是什么样子。在字符串,如果我们知道A,我们也知道B和C *:如果A为5,则B为6,C为7。因此,我们可以列举以下选项:一种CXXX

  • 012XXX
  • 123XXX
  • 234XXX
  • 456XXX
  • 789XXX

目前尚不清楚是否有“包装纸”。如果有,我们还包括

  • 890XXX
  • 901XXX

通过与上述相同的理由,每个解决方案都具有关联的组合。因此,只需计算出必须有多少解决方案。记住计数替代排序,如X Ç X X 103X一种CXX

现在我们到达了最尖锐的角落,这就是包含-排除原则。我们已将所有六位PIN的集合分为三组:

A.允许的PIN B.由于“相邻数字”而导致的无效PIN C.由于“顺序数字”而导致的无效PIN

C|小号|=|一种|-||-|C||小号|=|一种|-||-|C|+|C|CCC

发生这种情况的方式有几种:

  • 一种一种CXX
  • 一种CXdd

稍微高级些的方法将利用基本的组合结果和计数的基本定理,但是我选择了这种方法,因为它给读者带来了最小的技术负担。

1个|小号|

从“五个直到锁定”的皱纹绝对可以更好地防止未经授权的访问,因为在4位数或6位数方案中,存在很多选择,甚至五个不同的随机猜测也很低成功的可能性。对于一个恰当的概率问题,可以计算出这种攻击成功的概率。

但是,除了数字序列的概率外,其他因素也可能会影响PIN机制的安全性。首先,人们倾向于不随机选择PIN!例如,某些人将其出生日期,孩子的出生日期或一些类似的个人相关号码用作PIN。如果攻击者知道用户的DOB,则可能是他们尝试的第一件事。因此,对于特定用户,某些组合可能比其他组合更有可能。

*您列出的顺序严格递增,并且不清楚您说“三个连续数字”时是递增还是递减。


1

获得一个封闭的公式似乎很复杂。但是,枚举它们很容易。568 916第二种解决方案有可能的代码。大于具有四位数PIN码的解决方案的数量。枚举它们的代码如下。尽管没有优化,但只需要几秒钟即可运行。

注意。我假设序列必须按升序排列(可以在中轻松修改three_running

N = 999999

candidates = range(N)

def same_consecutive_digits(x):
    x_string = str(x).zfill(6)
    for i in range(1,len(x_string)):
        if x_string[i] == x_string[i-1]:
            return True
    return False

def three_running(x):
    x_string = str(x).zfill(6)
    for i in range(2,len(x_string)):
        if int(x_string[i]) == int(x_string[i-1]) + 1 and int(x_string[i-1]) == int(x_string[i-2]) + 1:
            return True
    return False

def valid(x):
    return not same_consecutive_digits(x) and not three_running(x)

assert(same_consecutive_digits(88555))
assert(same_consecutive_digits(123))
assert(not same_consecutive_digits(852123))
assert(three_running(123456))
assert(not three_running(4587))
assert(valid(134679))
assert(not valid(123894))
assert(not valid(111111))
assert(not valid(151178))
assert(valid("031278"))

accepted = [i for i in range(N) if valid(i)]
print(len(accepted))

密码(但不会在您的描述中)隐含一个假设,即PIN永远不会以数字“ 0”开头。PIN或密码通常并非如此。允许这样的零的正确答案是568916。但是,请记住,相关的答案将认为,通过利用约束条件,可以更有效地解决此受限问题中对PIN的攻击,这暗示着仅对可能性进行枚举并不能充分代表PIN的“优势”。正如对该问题的评论所指出的那样。
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.