问题描述
我一直试图弄清楚如何让此代码仅在值通过 cli 与给定值匹配时才起作用,例如 ubuntu。该代码有效,但是当我给出另一个密码/哈希而不是 test/npDnXtpN5py4 时,它仍然说密码与原始密码匹配。谁能帮忙?问候。
import os,sys
import getopt
import pwd
import crypt
def checkPassword(pswd,cpswd):
""" Check if `cpwsd` an encrypted version is of `pswd`.
Return `True` of `False`
"""
try:
cpswd = 'npDnXtpN5py4U'
pswd = 'test'
cryptedpassword = crypt.crypt(pswd,cpswd)
return cpswd == cryptedpassword
except KeyError:
return 0 # no such pw
if __name__ == '__main__':
opts,args = getopt.getopt(sys.argv[1:],'V',[])
if len(args) != 2:
print('Usage: {} [-v] <cpswd> <pswd>'.format(sys.argv[0]))
sys.exit(0)
cpswd,pswd = args[0],args[1]
res = checkPassword(pswd,cpswd)
if res:
print("Pass for '{}' is '{}'".format(
cpswd,pswd))
else:
print("Pass for '{}' is not '{}'".format(
cpswd,pswd))
解决方法
checkPassword(pswd,cpswd)
中的此代码:
cpswd = 'npDnXtpN5py4U'
pswd = 'test'
...将覆盖函数的参数,也称为 pswd
和 cpswd
,因此它本质上将测试是否 crypt.crypt('test','npDnXtpN5py4U') == 'npDnXtpN5py4U'
。
显然,'npDnXtpN5py4U'
是加密字符串 'test'
的可能结果,因此调用 crypt.crypt('test','npDnXtpN5py4U')
将始终返回其最后一个参数:
>>> import crypt
>>> cpswd = 'npDnXtpN5py4U'
>>> pswd = 'test'
>>> crypt.crypt(pswd,cpswd)
'npDnXtpN5py4U'
总而言之,问题在于这个函数完全无视传递给它的参数,并且总是返回相同的结果。