0

所以我正在编写这个程序,它需要检查 etc/shadow 中的密码哈希并将其与用户输入的密码进行比较。我尝试用 hashlib.sha512 加密密码,但结果不一样。我想它是怎么加盐的,但我不知道它是否使用通用盐,或者我每次都能得到盐。

tldr; 我需要一种用户输入密码的方法,然后让程序对其进行哈希处理并根据 etc/shadow 进行检查。有任何想法吗?

4

3 回答 3

4

试试这个https://pypi.python.org/pypi/pam。谷歌中的第一个链接由python pam. 如果存在,请查看 python-pam 的分发包管理器。否则使用pipor安装easy_install

小例子:

>>> import pam
>>> pam.authenticate('fred', 'fredspassword')
False
于 2013-08-07T17:54:49.077 回答
3
>>> import crypt
>>> line = 'bob:$1$qda8YAO9$rBiov9uVJlH1/97cbcyEt.:15965:0:99999:7:::'
>>> encript = line.split(':')[1]
>>> encript
--> '$1$qda8YAO9$rBiov9uVJlH1/97cbcyEt.'

>>> i = encript.rfind('$')
>>> salt = encript[:i]
>>> salt
--> '$1$qda8YAO9'

>>> crypt.crypt('bob_password',salt)
--> '$1$qda8YAO9$rBiov9uVJlH1/97cbcyEt.'
>>> encript
--> '$1$qda8YAO9$rBiov9uVJlH1/97cbcyEt.'
于 2014-12-03T22:18:50.683 回答
2

passwd 字段不仅仅是密码的 SHA-512 哈希值。*

这在crypt手册页中有解释。格式为$id$salt$hash,其中id指定哈希方法(1 表示 MD5,2a 表示 Blowfish,5 表示 SHA-256,6 表示 SHA-512),salt指定用于该算法的盐,并hash指定结果应该是什么。

正如手册页所暗示的那样,您实际上可以将整体传递$id$salt$crypt函数来代替salt,它会自动使用适当的算法。这不会太难通过,比如说,ctypes


无论如何,你所做的几乎肯定是个坏主意。你需要运行 asroot才能访问/etc/shadow,如果你真的想验证用户是否可以登录,你需要模拟的不仅仅是密码验证,当然你需要处理安全输入并确保您最终不会将密码以明文形式保存在某处等等。让PAM为您完成工作要简单得多,也更安全。


* 我相信理论上,它可以是——如果它不以 a 开头,它会被$解释为某种遗留格式……大概意味着它crypt使用 DES 算法被解释为 POSIX。

于 2013-08-07T18:34:18.213 回答