使用 shell 脚本检查用户密码

使用 shell 脚本检查用户密码

我有一个要求用户密码的脚本,我想检查给定的密码是否错误。

#A little fragment of my script

read -sp 'Your password: ' password;

if [[ $password -ne WHAT GOES HERE? ]]; then
    MORE CODE HERE
else
    MORE CODE HERE
fi

答案1

没有完全可移植的方法来检查用户的密码。这需要一个特权可执行文件,因此这不是您可以从头开始创建的东西。聚丙烯酰胺用于大多数非嵌入式 Linux 系统以及许多嵌入式系统和大多数其他 Unix 变体,附带 setuid 二进制文件,但它没有直接的 shell 接口,您需要通过 PAM 堆栈。

您可以在 Perl、Python 或红宝石

您可以安装多个之一checkpassword实施。

如果允许用户运行 sudo 进行任何操作,sudo -kv则会提示进行身份验证(除非已在 sudo 配置中禁用此功能)。但如果没有与用户有关的 sudoers 规则,则该方法不起作用。

你可以跑su。这适用于大多数实现。对于您的情况,这可能是最好的选择。

if su -c true "$USER"; then
  echo "Correct password"
fi

答案2

您可以验证给定的当地的使用影子文件的给定用户名的密码是正确的。

在大多数现代发行版中,散列密码存储在影子文件 /etc/shadow 中(只有 root 可以读取)。作为 root,从给定用户的影子文件中提取该行,如下所示:

cat /etc/shadow | grep username

你会看到这样的东西:

username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::

用户名后面有$1。这表明它是 MD5 哈希值。之后还有另一个 $,然后(在本例中)TrOIigLp 后面跟着另一个 $。 TrOIigLp 是盐。之后是哈希密码,使用盐进行哈希处理 - 在本例中为 PUHL00kS5UY3CMVaiC0/g0。

现在,您可以使用 openssl 使用相同的盐对给定密码进行哈希处理,如下所示:

openssl passwd -1 -salt TrOIigLp

出现提示时输入给定的密码,openssl 命令应使用提供的盐计算 MD5 哈希值,并且它应与影子文件中的上述内容完全相同。上面的命令-1用于 MD5 哈希。

答案3

这是一个相对强大的解决方案,它适用于本地和远程用户,并尝试针对相关用户的完整 PAM 堆栈进行身份验证,而不是简单地比较密码哈希值。

#!/usr/bin/env ruby

require 'rpam'

username = ARGV[0]
password = ARGV[1]

if Rpam.auth(username, password, service: 'system-auth')
  puts 'authentication successful'
  exit 0
else
  puts 'authentication failure'
  exit 1
end

要运行它:将其另存为./authenticate_as.rbchmod +x ./authenticate_as.rb./authenticate_as.rb $username $password。需要 Ruby 和 rpm gem,以防不明显。

答案4

这是一个Python版本:

$ mkdir /tmp/venv

$ cd /tmp/venv

$ python3 -m venv .

$ ./bin/pip install python-pam six
Collecting python-pam
  Using cached python_pam-2.0.2-py3-none-any.whl (10 kB)
Collecting six
  Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: python-pam, six
Successfully installed python-pam-2.0.2 six-1.16.0

$ ./bin/python
Python 3.11.5 (main, Aug 25 2023, 07:43:52) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pam
>>> pam.authenticate("pmorch", "mypass")
True
>>> 

作为https://pypi.org/project/python-pam/指出:

请注意,python-pam 和全部进行身份验证的工具遵循两个规则:

  • 您拥有 root(或特权访问权限):您可以检查任何帐户密码的有效性
  • 您没有 root:您只能检查运行该工具的用户名的有效性

(我pmorch在我的机器上。不,mypass这不是我的真实密码

相关内容