所以我正在编写这个程序,它需要检查 etc/shadow 中的密码哈希并将其与用户输入的密码进行比较。我尝试用 hashlib.sha512 加密密码,但结果不一样。我想它是怎么加盐的,但我不知道它是否使用通用盐,或者我每次都能得到盐。
tldr; 我需要一种用户输入密码的方法,然后让程序对其进行哈希处理并根据 etc/shadow 进行检查。有任何想法吗?
所以我正在编写这个程序,它需要检查 etc/shadow 中的密码哈希并将其与用户输入的密码进行比较。我尝试用 hashlib.sha512 加密密码,但结果不一样。我想它是怎么加盐的,但我不知道它是否使用通用盐,或者我每次都能得到盐。
tldr; 我需要一种用户输入密码的方法,然后让程序对其进行哈希处理并根据 etc/shadow 进行检查。有任何想法吗?
试试这个https://pypi.python.org/pypi/pam。谷歌中的第一个链接由python pam
. 如果存在,请查看 python-pam 的分发包管理器。否则使用pip
or安装easy_install
。
小例子:
>>> import pam
>>> pam.authenticate('fred', 'fredspassword')
False
>>> 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.'
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。