我正在制作一个程序,以检查文件中是否有用户输入。如果用户输入当前不在文件中,那么我们将把该输入附加到used_passwords文件中,并要求用户再次键入其他内容。否则,如果他们重新输入我们刚刚添加的输入(或任何预设),那么我们想告诉他们他们不能重复使用密码。
此代码存在的问题是,每当我输入used_passwords文件中单词中的字母,或者如果我输入文件中单词的一部分时,程序就会告诉我无法重用密码。
例如:如果我输入“ abc”,程序将告诉我我已经重用了该密码,并且我认为这可能是因为程序逐个字符地读取文件并在abcdeF!23中读取了abc!
尽管,我不希望程序告诉我不能重复使用文件中的一个或多个字符。我想让程序告诉我不能重用程序中的单词
我还想知道我们是否可以将输入或预设放入文件数组中。
fileUsed_Pass = open("used_passwords.txt", 'a')
fileUsed_Pass.write("\nabcdeF!23")
fileUsed_Pass.write("\n\n")
fileUsed_Pass.write("zxcbhK#44")
fileUsed_Pass.write("\n\n")
fileUsed_Pass.write("poiuyT&11")
fileUsed_Pass.write("\n\n")
fileUsed_Pass.close()
def password():
string = input("Enter Here:")
if string in open('used_passwords.txt').read():
print("You can not reuse that password!\n")
password()
else:
# file-append.py
f = open('used_passwords.txt','a')
f.write('\n'+string)
f.close()
password()
password()
更新:我已经获得了使用with语句的代码。
我没有使用If和else语句,而是使用了with语句。
我在这里正在检查每一行,以查看是否有与我的输入字符串匹配的文本。如果没有,则将some_variable等于True。如果不是,那么我们将其设为false。
with open("used_passwords.txt", 'r') as tFile:
for line in tFile:
if string != line and string+"\n" != line:
some_variable = True
else: #If it equals anything else from the file, then false
some_variable = False
break
#print(some_variable)
#this was added for me/the user to make sure that the with statement was working
然后,如果它等于True:我们将其添加到文件中。如果没有,我们将让用户输入另一个与文件insie不匹配的密码。
tFile = open("used_passwords.txt", 'a')
if some_variable == True:
tFile.write("\n" + string)
print("\nGOOD! Password does not match old ones!")
elif some_variable == False:
print("\nYou can not re-use a password!")
password()
答案 0 :(得分:0)
考虑到要在文件中输入的每个密码后添加一个\ n,可以尝试将\ n附加到string
变量中,然后进行搜索。
答案 1 :(得分:0)
直接处理文本文件可能不是最大的解决方案。 您应该考虑改用某种形式的数据库(例如sqlite3 library,它是IIRC随Python3预先安装的。)
此外,请记住,以明文形式存储密码是安全的“禁止”。 至少,请使用众多可用的cryptographic hash functions中的一种,然后存储并比较哈希,而不是密码。
这是同时使用sqlite3和SHA-256(一种常见的哈希函数)的基本示例:
#!/usr/bin/python3
import sqlite3
import hashlib
db = sqlite3.connect( "used_passwords.db" )
cur = db.cursor()
cur.execute( "CREATE TABLE IF NOT EXISTS passwords( pwd TEXT, UNIQUE( pwd ))" )
def password():
pwd = input( "password: " )
sha = hashlib.sha256( pwd.encode( 'utf-8' )).hexdigest()
cur.execute( "INSERT INTO passwords VALUES( ? )", ( sha, ))
while True:
try:
password()
break
except KeyboardInterrupt:
print( "aborted" )
break
except sqlite3.IntegrityError:
print( "cannot reuse that password" )
db.commit()
db.close()
请注意UNIQUE
上的pwd
约束,该约束确保只要sqlite3.IntegrityError
中已经存在密码,就会引发passwords
异常(这将使验证隐式,并且使SQL的繁琐程度降到最低)。
用法示例:
% ./pwd.py
password: foo
% ./pwd.py
password: foo
cannot reuse that password
password: bar
%
您可以验证数据库中是否没有明文密码:
% sqlite3 ./used_passwords.db
SQLite version 3.16.2 2017-01-06 16:32:41
Enter ".help" for usage hints.
sqlite> select * from passwords;
2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae ; <- this is "foo"
fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9 ; <- this is "bar"
sqlite>
当然,您可以对此进行扩展并添加更多功能,例如对多个用户的支持,密码有效期等等。
答案 2 :(得分:-1)
您正在使用.read(),它将整个文件读取为一个字符串。
import math
def _getIndexPage(index, items_per_page=7):
return int(math.ceil(index / items_per_page))
改为使用.readlines()并遍历每一行以检查字符串是否在任何文件行中。