Python输入密码并与Shadowed Password Database进行比较

时间:2013-04-06 04:13:05

标签: python crypt

美好的一天。

我试图写一个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来获取哈希以匹配系统密码

1 个答案:

答案 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)