【问题标题】:Python with etc/Shadow带有 etc/Shadow 的 Python
【发布时间】:2013-08-07 17:48:59
【问题描述】:

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

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

【问题讨论】:

  • 我不确定,但可能不需要访问影子文件。您不能使用操作系统的 API 尝试登录用户(因为您有用户名和密码)?当您可以登录时,凭据是好的,如果不是,那么它们不是。
  • 另外,/etc/shadow 甚至不应该被普通用户阅读。

标签: python linux encryption sha512


【解决方案1】:

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

小例子:

>>> import pam
>>> pam.authenticate('fred', 'fredspassword')
False

【讨论】:

  • 不知道为什么这个被否决 - 我认为它是最好的解决方案。没有 su/shadow/hash 技巧,适用于使用不同身份验证机制的服务器。也许需要一个例子? import pam;pam.authenticate('fred', 'fredspassword').
  • @user1377480,你有回溯吗?你是怎么安装这个的?可能缺少依赖项或不兼容的库版本。
  • 我的公园里没有 CentOS。
【解决方案2】:
>>> 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.'

【讨论】:

    【解决方案3】:

    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 为您完成工作更简单、更安全。


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      相关资源
      最近更新 更多