在Linux上,检测影子密码文件的最佳方法是什么。
这是一种方法:
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
int main(int argc, char *argv[]) {
struct passwd *p;
if (!(p = getpwuid(0)))
{
printf("root user not in /etc/password\n");
exit(1);
}
if (strcmp(p->pw_passwd, "x")) {
printf("using shadow passwd\n");
} else {
printf("shadow passwd\n");
}
exit(0);
}
我并不特别关心htat解决方案,因为它不直接。
有更直接的东西吗? 有什么东西不需要读取passwd文件吗?
我的偏好是不需要root权限的解决方案。
虽然比这复杂一点,但我的目的是向用户提供有关其计算机上的安全状态的明确错误消息。例如,如果管理员选择在没有setuid root的情况下运行我的应用程序并且他们安装了影子密码,我想给他们一个明确的错误消息,他们必须选择其中一个。他们还可以选择不同的身份验证方案。
答案 0 :(得分:0)
您的代码不会检查是否正在使用阴影,只检查root帐户是否具有非阴影密码。将密码哈希设置为"x"
只是确保密码无法匹配的一种方法;其他角色也有效("*"
也很常见)。如果在使用阴影时完成,这只是作为一种预防措施,以防止不知道阴影的程序允许通过空密码登录;否则将该字段留空也是一样好。
检查root是否使用影子密码的方法是调用getspnam("root")
。如果你不是root,这当然会失败;这就是影子的全部意义。并且它并不一定告诉你所有用户都存在影子密码,尽管混合阴影和非阴影是不常见的。
为什么你需要知道阴影是否正在使用中?也许有更好的方法去做你想要实现的目标。