【问题标题】:Password Checker密码检查器
【发布时间】:2015-12-18 17:07:48
【问题描述】:

我创建了一个密码检查器,它生成一个随机字符并进行比较,直到所有字符都相同。但是当它滚动时,它会多次重复这个角色。有没有办法让角色不重复,可能将角色放入列表中?然后我可以使用

list.del()

阻止它重复的功能。这是我的代码:

import string
import random
import time
print('Welcome to the password checker')
characters = string.ascii_lowercase + string.digits + string.ascii_uppercase + ' .,!?;:`"+/*()@#$&_-='

password = input("Enter your password: ")
tryFirst = ''.join(random.choice(characters) for i in range(len(password)))
trySecond = ''

Finished = False

attempt = 0
while Finished == False:
    print("{}) {}".format(attempt,tryFirst))
    trySecond = ''
    Finished = True
    for num in range(len(password)):
        if tryFirst[num] != password[num]:
            Finished = False
            trySecond += random.choice(characters)
        else:
            trySecond += password[num]
    attempt += 1
    tryFirst = trySecond
    time.sleep(0.05)
print("Password found! That took {} attempts".format(attempt))
if attempt < 100:
    print("Your password isn't safe")
elif attempt < 250:
    print("Your password is quite safe, could do with improvement")
elif attempt < 400:
    print("Your password is adequately safe")
elif attempt < 600:
    print("Your pasword is safe")

【问题讨论】:

  • 洗牌一次,然后根据需要弹出()项目。
  • 您使用的破解用户密码的方法与攻击者获取密码的方式无关。您需要担心诸如字典攻击和彩虹表之类的事情,或者您的数据库被盗。我建议花一些时间阅读security.stackexchange.com 上有关密码保护的问题。如果您觉得自己无法以这种方式处理事情,也许只是问一下这种方法有什么问题。
  • 特别是,正确构建的身份验证系统将永远向攻击者公开第一个、第二个或任何单个字符是否正确。 (攻击者只会在整个密码上得到“是”或“否”。他们无法判断第一个字符是否正确。)您的算法还可以报告不同级别的安全性由于随机性,密码相同;您必须运行此 多次 次并取平均值。而且,如果平均猜测次数少于数十亿或数亿次,那么密码就极其不安全。
  • @jpmc26 这个程序只是用来检查密码的安全性
  • 为什么不直接使用正则表达式来确保密码符合特定条件?

标签: python regex python-3.x


【解决方案1】:

快速解答

首先,正如其他人已经提到的那样,您的方法不会给您寻求的答案。例如,输入example 作为第一个密码,输入Qm2cl?X 作为第二个密码。尽管它们显然不是同样强的密码,但您的程序将返回类似的结果。第一个可以在字典中找到,而第二个更难猜(它具有更多的随机性)。

要回答您的问题,您可以在每次迭代时对单词中的所有位置使用相同的随机字符。然后您可以安全地将每个选中的字符从characters 列表中弹出。这是一个可能的实现:

import string
import random
import time

print('Welcome to the password checker')
characters = string.ascii_lowercase + string.digits + string.ascii_uppercase + \
             ' .,!?;:`"+/*()@#$&_-='
characters = list(characters)
random.shuffle(characters)

password = input("Enter your password: ")
tryFirst = characters.pop() * len(password)

Finished = False

attempt = 0
while not Finished:
    print("{}) {}".format(attempt, tryFirst))
    trySecond = ''
    Finished = True
    try:
        char = characters.pop()
    except IndexError:
        print 'No more characters to check'
    for num in range(len(password)):
        if tryFirst[num] != password[num]:
            Finished = False
            trySecond += char
        else:
            trySecond += password[num]
    attempt += 1
    tryFirst = trySecond
    time.sleep(0.05)
print("Password found! That took {} attempts".format(attempt))
if attempt < 100:
    print("Your password isn't safe")
elif attempt < 250:
    print("Your password is quite safe, could do with improvement")
elif attempt < 400:
    print("Your password is adequately safe")
elif attempt < 600:
    print("Your password is safe")

基本问题

然而,一个问题是您单独检查每个字符,这对于真正的黑客来说是不可能做到的。通过这样做,您可以显着降低查找正确密码的难度。例如,在您的情况下,您的 characters 列表中有 83 个不同的字符。通过单独检查每个字符,您将永远不需要超过 83 次尝试才能获得正确的密码(如果您消除了重复问题)。如果您只能检查一个完整的密码而不是单独检查字符,就像在现场情况下那样,尝试找到正确密码的次数要高得多,为83^password_length/2。例如,您已经平均需要 3444 次尝试才能猜出两个字符的密码,而平均需要 285893 次才能猜出三个字符的密码。

因此,如果您真的想知道原始蛮力算法需要猜测由characters 列表中的 83 个字符组成的给定密码的尝试次数,只需使用以下公式:83^password_length/2

但请注意,这并没有考虑到人类倾向于选择具有特定结构并因此具有一定可预测性的密码。密码破解程序通过使用例如字典攻击和彩虹表来利用这个弱点。因此,破解程序需要的实际尝试次数可能比这个公式建议的要低得多。

【讨论】:

    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2010-11-26
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多