密码破解

Password Cracking

我以前在这里问过一次这个问题,但没有得到我想要的答案,但我找到了另一种方法。所以我又来了。

(之前找到的答案的问题是它非常高效,有点太高效了。我无法计算比较,我希望它是找到密码的最简单的方法,所以我可以对它实施评级系统。)

我想制作一个密码评级程序,根据时间长度和程序为找到正确密码而必须进行的比较量对密码进行评级。

我希望使用多种不同的方法来破解输入,例如:将输入与常用词数据库进行比较,并生成以第一个字符开头的密码的所有可能性。

问题:

我找不到从列表中的一个元素开始的方法,我们称之为 A

运行 Achr(32) - chr(127) ('space' - '~'),然后将第二个元素添加到名为 B 的列表中.

对于第二个循环,设置 A = chr(32)B 然后 运行 到 chr(32) - chr(127)A 然后会变成 chr(33) 并且 B 会 运行 通过所有字符等等。直到比较完所有可能的选项,然后在下一个循环中它会在列表中添加另一个元素并继续搜索,从 chr(32)chr(32)chr(32-127) 开始。继续此模式,直到找到正确的密码。

这是我能找到的最接近可行的东西(我知道这很糟糕)。

while ''.join(passCheck) != ''.join(usrPassword) :


    for i in range(0, len(usrPassword)) :
        if ''.join(passCheck) != ''.join(usrPassword) :
            passCheck.append(' ')

            for j in range(32, 127) :
                if ''.join(passCheck) != ''.join(usrPassword) :
                    passCheck[i] = chr(j)
                    for k in range(0, len(passCheck)) :
                        for l in range(32, 127) :
                            if ''.join(passCheck) != ''.join(usrPassword) :
                                passCheck[k] = chr(l)
                                print(passCheck)

如果你按字母顺序检查,那么你只需要一个循环来计算它需要检查多少次

你有 96 个字符 (127-32+1)

password = 'ABC'

rate = 0

for char in password:
    rate = rate*96 + (ord(char)-31)

print(rate)

这个问题的答案很可能是你想问另一个,很遗憾。

检查密码强度不像计算所有可能的组合、香农熵等那么简单

重要的是所谓的 "guessing entropy",它是原始暴力熵、已知密码列表和密码泄漏列表、应用于这些列表的规则、与这些列表中元素的 Levenshtein 距离的极其复杂的组合,人工生成的字符串和短语、键盘走动等

此外,密码强度 深深地 植根于问题 "How was this password generated?" ...确实很难自动检测和计算 事实。作为人类,在许多情况下,我们可以通过对人们如何 select 密码的 心理学 进行逆向工程来 近似 ......但这仍然是一门艺术,而不是一门科学。

例如,'itsmypartyandillcryifiwantto' 是一个糟糕的密码,尽管它的香农熵相当大。 'WYuNLDcp0yhsZXvstXko' 是一个随机生成的密码……但现在它是 public,这是一个糟糕的密码。在您知道 'qscwdvefbrgn' 或 'ji32k7au4a83' 之类的密码是如何生成之前,它们看起来很强大......但它们 肯定 不是。

因此,如果您对问题应用严格答案,您可能会得到一个大大高估许多密码强度的工具。如果您的目标实际上是鼓励您的用户创建抗暴力破解的密码,您应该鼓励他们使用随机生成的密码,并确保您的密码使用非常慢的哈希存储(Argon2 系列、scrypt、bcrypt 等 -但在选择一个之前,一定要针对 UX 和服务器性能对这些进行基准测试。

参考资料和进一步阅读(免责声明:部分是我的回答或有我的意见):