尝试一定次数后锁定的 Python 密码系统

Posted

技术标签:

【中文标题】尝试一定次数后锁定的 Python 密码系统【英文标题】:Python password system with lock after certain number of attempts 【发布时间】:2018-09-05 05:47:32 【问题描述】:

所以我试图在 Python 中创建一个密码系统,在经过一定次数的错误尝试后,用户将被阻止访问它,例如 5 分钟。我目前不确定在重新运行同一个文件然后以这种方式使用后如何保留变量的值。有人可以帮我解决这个问题,因为我目前还是 Python 新手吗?

更新:

在对 Jonas Wolff 提供给我的代码进行了一段时间的试验后,我最终确定了以下代码:

def password(): 
    count = 0 
    currentTime = float(time.time()) 
    passwordList = ["something", "password", "qwerty", "m42?Cd", "no"] 
    passwordNum = random.randint(0, 4) 
    password = passwordList[passwordNum] 
    with open("password.txt", "r") as file:
        check = file.readline()
        initialTime = file.readline()
        if initialTime=="":
            initialTime==0
    if int(check)==1 and (currentTime-float(initialTime))<300:
        print("You are still locked")
        print("Please try again in", int(300-(currentTime-float(initialTime))), "seconds.")
        quit()
    print("The randomised password is No.", passwordNum+1) #Prints a string to let the user know which password was randomly selected
    while count<5:
        inp = input("Enter the Password: ")
        if inp==password:
            print("Access Granted")
            print()
            f = open("password.txt", "w")
            f.write("0\n0")
            f.close()
            select()
        elif (count+1)==5:
            print("You have been locked")
            print("Please try again in 5 minutes")
            f = open("password.txt", "w")
            f.write("1\n")
            f.write(str(currentTime))
            f.close()
            quit()
        else:
            count+=1
            print("Incorrect Password")
            print("You have", 5-count, "tries left.")
            continue

非常感谢您提供的帮助以及您耐心回答我的问题。

【问题讨论】:

请向我们展示您的代码。 How to Ask 您是否希望在问题运行之间将某种信息存储在文件中? 也许你可以使用 timeit 模块 您是否希望在您之前编写的程序关闭时也保存尝试? 是的,我确实希望即使在程序关闭后也能存储尝试,这样如果每次输入错误的密码后重新运行,用户将无法输入密码,直到“锁定”持续时间结束。我曾尝试使用泡菜来做到这一点,但我仍然不确定它是如何工作的。会不会有更简单的方法,比如 javascript 中的 sessionStorage?请注意,我正在尝试仅在 Python 中执行此操作(因为我认为如果我使用 SQL 或类似的数据库是可能的)。如果无法做到,请告诉我。谢谢。 【参考方案1】:
import YourProgram # this is the program you want to run, if the program runs automaticly when opened then move the import to the part where i wrote YourProgram() and delete the YourPregram() line
import time

pswd = "something"

count = 0

with open("PhysxInit.txt","r") as file:
    file_info = file.readline()
    numa = file_info.count("1")
    count = numa


while True:
    with open("PhysxInit.txt","r") as file:
        file_info = file.readline()
        tima = file.readline()


    inp = input("What is the password:")



    if inp == pswd:

        if tima == "":
            tima = "0"  # this should solve yoúr problem with float convertion however it doesn't make sence that this step should be needed


        if str(file_info[:5]) != "11111" or time.time() > float(tima):
            YourProgram() # this is just meant as the thing you want to do when when granted acces i magined you where blocking acces to a program.
            f = open("PhysxInit.txt", "w")
            f.write("\n")
            f.close()
            break
    else:
        count += 1
        f = open("PhysxInit.txt", "w")
        f.write(("1"*count)+"\n"+str(tima))
        if count == 5:
             f.write(str(time.time()+60*5))
        f.close()

#f = open("PhysxInit.txt", "w")
#f.write("\n")
#f.close()

这行得通吗? 只要确保你有一个名为 PhysxInit.txt 的文本文件

运行程序后,猜错了几次,我的txt文件是这样的。

11111
1536328469.9134998

它应该看起来像我的,虽然数字可能不同。

要按照您的要求阅读特定行,您需要这样做:

with open("PhysxInit.txt", "r") as f:
    for w,i in enumerate(f):
        if w == #the number line you want:
            # i is now the the line you want, this saves memory space if you open a big file

【讨论】:

现在修复它,它会读取你已经尝试了多少次 我刚刚尝试了您的代码,但在输入密码后,它会无限期地要求输入密码。您的代码中是否有任何我需要调整的内容才能与我的程序一起使用(我有一个名为 PhysxInit 的 txt 文件)? 请记住,如果您未能输入 5 次,您将被永久锁定,因为它会将其保存在文本文件中。 在另一张纸条上,它将失败尝试的数量存储为 PhysxInit.txt 文件中的数量它会忘记你曾经猜错了,但是你猜错了 5 次,那么就没有自动返回的方法,因为我可以理解你希望这发生在所说的时间已经过去,如果您在第一行写“\n”的某个时间戳已经过去 我已经编辑了代码,它现在似乎可以工作了,所以它只会将你锁定 5 分钟而不是永远

以上是关于尝试一定次数后锁定的 Python 密码系统的主要内容,如果未能解决你的问题,请参考以下文章

Python3 模拟用户密码输入三次错误后锁定

通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账

abp框架修改密码错误次数

初一下:Python利用while语句,设置密码次数为6次,超过6次就显示:“输入次数已达上限,被锁定”?谢谢

通过游戏学python 3.6 第一季 第七章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账

python用户名密码限定次数登录