【问题标题】:Compare current password of a Linux user with an entered password in Perl将 Linux 用户的当前密码与 Perl 中输入的密码进行比较
【发布时间】:2014-08-10 06:02:13
【问题描述】:

我想知道用户名在表单中提供的密码是否是用户在给定主机的系统上拥有的密码...我需要这个才能更改密码或返回错误消息给请求它的用户。特别希望在 Perl 中完成。

我有以下测试来查看用户是否存在,如果成功则匹配密码,如果成功则更改随请求提供的新密码我正在使用 JSON Rpc Dispatcher 为客户端提供服务。

if (getpwnam("$username")) { 
#  if ($currentpass == $sytempass)  {}              
return "User $username password is $newpass success!";
#   else { return current password is incorrect}       
} 
else {
return "user $username never existed here";
} 

【问题讨论】:

    标签: linux unix encryption passwords perl


    【解决方案1】:

    标准的 Linux 身份验证接口是 PAM,例如Authen::PAMAuthen::Simple::PAM。例如:

    use Authen::Simple::PAM;
    
    my $pam = Authen::Simple::PAM->new(service => "login");
    
    if ($pam->authenticate($username, $password)) {
        # ...
    }
    

    仅对于本地帐户,密码哈希通常存储在“影子”文件中。 Perl 会在调用getpwent() 时自动检索它们:

    my @pwent = getpwnam($username);
    my $known_good_hash = $pwent[1];
    my $checking_hash = crypt($password, $known_good_hash);
    
    if ($checking_hash eq $known_good_hash) {
        # ...
    }
    

    crypt() 函数将“salt”作为第二个参数。当与哈希比较时,您应该给它完整的原始哈希,它会从中提取盐。)

    请注意,您必须具有 root 访问权限才能使用任一工具。

    【讨论】:

    • 很好的答案,谢谢。我没有意识到你可以从消化物本身中获得盐!我正要写:你不能这样做,因为这两种盐不一样......哈哈,你教会了我一些东西,让我免于尴尬,谢谢。
    • 使用 getpwent() 的第二个选项非常完美,刚刚测试过,非常棒,感谢 Grawity!!!
    • @MariusMatutiae:是的,大多数现代算法的 crypt() 散列形式为 $alg$salt$hash,旧的 DES 散列形式为 ssHHHHHHHHHHH,在这两种情况下都包含盐。 这也是操作系统本身根据 /etc/shadow 验证密码的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多