我有一个用 C 编写的程序在嵌入式 Linux 上运行,有时它想检查系统用户的密码。
- 如果我能得到/etc/passwd的加密盐,我可以使用 crypt() 来检查用户密码的更正。
- 有没有什么shell脚本可以帮我查密码?比如check_passwd用户名密码,那么它返回的值是正确还是不正确?谢谢!
我有一个用 C 编写的程序在嵌入式 Linux 上运行,有时它想检查系统用户的密码。
我最近一直在解决同样的任务。这是 C 函数的示例(与 -lcrypt 链接)。请注意,您需要对文件 /etc/passwd 和 /etc/shadow 具有读取权限。
#include <sys/types.h>
#include <pwd.h>
#include <shadow.h>
#include <crypt.h>
#include <string.h>
#include <stdio.h>
/// @return 0 - password is correct, otherwise no
int CheckPassword( const char* user, const char* password )
{
struct passwd* passwdEntry = getpwnam( user );
if ( !passwdEntry )
{
printf( "User '%s' doesn't exist\n", user );
return 1;
}
if ( 0 != strcmp( passwdEntry->pw_passwd, "x" ) )
{
return strcmp( passwdEntry->pw_passwd, crypt( password, passwdEntry->pw_passwd ) );
}
else
{
// password is in shadow file
struct spwd* shadowEntry = getspnam( user );
if ( !shadowEntry )
{
printf( "Failed to read shadow entry for user '%s'\n", user );
return 1;
}
return strcmp( shadowEntry->sp_pwdp, crypt( password, shadowEntry->sp_pwdp ) );
}
}
请参阅给定 linux 用户名和密码,我如何测试它是否是有效帐户?了解如何检查用户提供的密码是否对该用户有效。
如上所述,处理此问题的正确方法是使用可插入的身份验证模块。您必须将 libpam 添加到您正在使用的任何嵌入式 linux 中,但这通常很容易(例如,buildroot 提供了一个 linux-pam 包)。