因此,我正在编写这个程序,它需要检查etc/shadow中的密码散列,并将其与用户输入的密码进行比较。我试着用hashlib.sha512加密密码,但结果不一样。我想它是怎么加盐的,但我不知道它是否使用了通用的盐,也不知道我如何每次都能得到盐。
我需要一种让用户输入密码的方法,然后让程序对其进行哈希处理,并根据etc/shadow进行检查。有什么想法吗?
发布于 2013-08-08 01:54:49
试试这个https://pypi.python.org/pypi/pam。第一个链接在谷歌的python pam。如果存在,请查看python-pam的发行包管理器。否则,使用pip或easy_install进行安装。
小示例:
>>> import pam
>>> pam.authenticate('fred', 'fredspassword')
False发布于 2014-12-04 06:18:51
>>> 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.'发布于 2013-08-08 02:34:18
passwd字段不仅仅是密码的SHA-512哈希。*
这在crypt manpage中有解释。格式为$id$salt$hash,其中id指定散列方法(1用于MD5,2a用于Blowfish,5用于SHA-256,6用于SHA-512),salt指定与该算法一起使用的盐,hash指定结果。
正如手册页所暗示的那样,您实际上可以将整个$id$salt$传递给crypt函数,而不是salt,它将自动使用适当的算法。比方说,通过ctypes,这并不难做到。
无论如何,你所做的几乎肯定是一个坏主意。您需要以root身份运行才能访问/etc/shadow,如果您真的想验证用户是否可以登录,那么您需要模拟的不仅仅是密码验证,当然,您还需要处理安全输入,并确保密码不会以明文形式保存在某个地方等等。让PAM为你做这件事要简单得多,也更安全。
*我相信从理论上讲,它可以是-如果它不是以$开头,它就会被解释为某种遗留格式的…这可能意味着它被解释为使用DES算法的POSIX crypt。
https://stackoverflow.com/questions/18110250
复制相似问题