2

再会。

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

4

1 回答 1

4

我已经做了一个关于如何使用影子密码进行身份验证的示例。我添加了一些注释,让代码自己说话。

一些额外的信息:

另请注意(来自 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)
于 2013-04-07T14:09:59.083 回答