美好的一天。
我试图写一个python脚本,它将获取一个捕获的密码然后进行比较 系统阴影密码。
我正在使用Ubuntu 12.10进行此测试。并以sudo身份运行脚本。
def login(user, password):
"Check if user would be able to login using password"
try:
pw1 = spwd.getspnam(user)[1]
allus = spwd.getspall()
print pw1
# pw2 = crypt.crypt(password, pw1[:2])
pw2 = crypt.crypt(password, '\$6\$SALTsalt\$')
print pw2
return pw1 == pw2
except KeyError:
return 0 # no such user
现在上面的回复
2个不同的密码,但我确实从阴影中得到了一个。
所以我的问题是如何加密提供的密码,以便我可以将其与之比较 一个人接受了。任何帮助都很棒
修改插件
def login(user, password):
"Check if user would be able to login using password"
try:
pw1 = spwd.getspnam(user)[1]
allus = spwd.getspall()
# print allus
print pw1
# pw2 = crypt.crypt(password, pw1[:2])
# pw2 = crypt.crypt(password, '\$6\$SALTsalt\$')
pw2 =hashlib.new()
pw2.update(password)
pw2.digest()
print pw2
return pw1 == pw2
except KeyError:
return 0 # no such user
那也行不通 如何使用haslib来获取哈希以匹配系统密码
答案 0 :(得分:2)
我已经就如何使用阴影密码进行身份验证做了一个示例。我添加了一些评论让代码说明一切。
一些额外信息:
另请注意(来自crypt模块文档):
该模块实现了crypt(3)例程的接口,该例程是基于修改的DES算法的单向散列函数;有关更多详细信息,请参见Unix手册页。可能的用途包括允许Python脚本接受来自用户的键入密码,或尝试使用字典破解Unix密码。
请注意,此模块的行为取决于正在运行的系统中crypt(3)例程的实际实现。因此,此模块也将提供当前实现中可用的任何扩展。
这也是为什么你不能毫无问题地使用hashlib
的原因。
import crypt # Interface to crypt(3), to encrypt passwords.
import getpass # To get a password from user input.
import spwd # Shadow password database (to read /etc/shadow).
def login(user, password):
"""Tries to authenticate a user.
Returns True if the authentication succeeds, else the reason
(string) is returned."""
try:
enc_pwd = spwd.getspnam(user)[1]
if enc_pwd in ["NP", "!", "", None]:
return "user '%s' has no password set" % user
if enc_pwd in ["LK", "*"]:
return "account is locked"
if enc_pwd == "!!":
return "password has expired"
# Encryption happens here, the hash is stripped from the
# enc_pwd and the algorithm id and salt are used to encrypt
# the password.
if crypt.crypt(password, enc_pwd) == enc_pwd:
return True
else:
return "incorrect password"
except KeyError:
return "user '%s' not found" % user
return "unknown error"
if __name__ == "__main__":
username = raw_input("Username:")
password = getpass.getpass()
status = login(username, password)
if status == True:
print("Logged in!")
else:
print("Login failed, %s." % status)