linux – 没有PAM验证用户的正确方法是什么?

因为我的相关问题似乎没有太多的爱,这里是另一个:
现在在Linux中通过用户名/密码提示验证用户的正确方法是什么?

原则上,我想我必须从/ etc / shadow获取用户名和密码,读取相应用户的salt和hash.然后我会计算给定密码的哈希值和存储的盐,并检查结果是否与存储在/ etc / shadow中的哈希相匹配.

通常,我可以简单地通过PAM(例如pam_unix)进行身份验证,它已经完成了所有这些,但我的应用程序是一个自定义PAM模块,我找不到从另一个调用一个PAM模块的方法.如果这可能以某种方式,我很乐意寻求这个解决方案.

到目前为止,我发现这真的是从1996年的http://www.tldp.org/HOWTO/Shadow-Password-HOWTO-8.html教程开始,显然,影子支持尚未构建到libc中.它提到pw_auth并且作为身份验证的辅助函数有效.我尝试将这些植入我的代码并链接到影子工具的libshadow.a但是我得到pw_auth的“未解决的外部引用”错误并且有效.代码看起来像这样:

if ((pw->pw_passwd && pw->pw_passwd[0] == '@'
     && pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL))
    || !valid (passwd, pw)) {
    return (UPAP_AUTHNAK);
}

我没有进一步检查,但无论如何这不是一个首选的解决方案,因为每次更新shadow-utils时我都必须更新我的代码.

我更愿意链接到一个提供针对/ etc / shadow的身份验证的库(不是PAM).有没有这样的事情,我还没找到呢?或其他一些解决方案?

解决方法:

你害怕更新shadow-utils是IMO没有根据的. HOWTO中描述的例程可以在我的Ubuntu 12.04和Mint 17系统上使用,而无需安装任何特殊的东西.

在C程序中读取/ etc / shadow信息的结构可以在/usr/include/shadow.h中找到,并且可以使用man 5 shadow和你需要查找的函数,例如: /usr/include/shadow.h中定义的按名称的影子密码条目是getspnam,它将为您提供一个手册页(man getspnam),描述该函数和所有相关函数.

基于此,您应该能够获得任何给定名称的哈希密码条目.散列密码应该有多个’$’标记,切除包括散列密码中最后一个’$’后的所有内容,并将其作为salt to crypt(),glibc版本(根据man 3 crypt)应该能够处理指示SHA512条目的“扩展”盐,现在更常见.

上一篇:Centos6.5 登录后跳回Login,循环登录问题


下一篇:roc曲线与sklearn [python]