本地vs全局变量Python

时间:2014-12-17 18:52:46

标签: python

我是编程新手,我想知道这是否可行。我正在尝试创建一个受密码保护的脚本,其中输入一次密码,然后在下次打开脚本时需要进行脚本处理。我在一个文件中存储和加密密码,然后在下次打开脚本时检查文件是否存在。我遇到的问题是检查密码是否匹配,因为原始密码在函数中作为局部变量。

def createFile():
    pw = input('Enter Password: ')
    pw2 = input('ReType Password: ')
    if pw == pw2:        
        newPw = encrypt(pw, 10)  #encodes the string with a key in a seperate encrypt function
        pwFile = open('PW.txt', 'a')
        pwFile.write(newPw)
        pwFile.close()
    else:
        print('The passwords do not match')
        createFile()


if os.path.isfile('PW.txt'):
    print('File exists')
    pwCheck = input('What is the password? ')
    #I can not check pwCheck == pw since pw is a local var.

    #progression of script here
else:
    createFile()

我知道将局部变量设为全局被认为是不好的。有没有办法重组我到目前为止的工作?在我写这篇文章时,我想我可能想出了一个可能的解决方案,但我现在没有时间对其进行测试。我是否使用相同的密钥为pwCheck运行相同的加密函数,然后检查它是否= =到PW.txt的第一行?这是正确的和/或是否有其他解决方案?

谢谢。

使用Windows,Python 3.4

2 个答案:

答案 0 :(得分:1)

而不是"加密",或许使用单向散列..然后,您可以散列随后输入的密码并检查它与存储在文件中的散列...类似于:

def createFile():
    pw = input('Enter Password: ')
    pw2 = input('ReType Password: ')
    if pw == pw2:        
        newPw = sha.new(pw).digest
        pwFile = open('PW.txt', 'a')
        pwFile.write(newPw)
        pwFile.close()
    else:
        print('The passwords do not match')
        createFile()


if os.path.isfile('PW.txt'):
    print('File exists')
    pwCheck = input('What is the password? ')
    previous = open('PW.txt', 'r')
    prevPass = previous.read()
    hashed = sha.new(pwCheck).digest()
    if (hashed==prevPass):
        #progression of script here
else:
    createFile()

答案 1 :(得分:1)

我真的希望这只是一个练习,因为如果你关心安全性,你应该使用其他一些身份验证机制来访问门户。最明显的是,unix权限和sudo to gate access。

假设它只是一个练习,只需要一个函数来检查文件的输入。类似的东西:

def doAuth():
    isAuthed = getPassInput() == getPassFromFile()
    if isAuthed:
       return True
    else:
       raise HellNoException("Passwords differ")