背景
最近本组有需求需要通过程序能够修改用户的登陆密码。在完整的 linux 系统中,可以通过 passwd 指令实现,但是嵌入式系统中一般为了精简,不会将此命令暴露出来,所以我们只能使用别的方式修改登陆密码。
linux passwd 密码构成
root:Shheg7V0sDMEk:0:0:root:/root/:/bin/sh
/etc/passwd 存放用户信息,由 6 个冒号组成 7 个信息。
-
用户名
-
密码(x 表示加密密码)
-
UID(用户标识)
-
GID(组标识)
-
用户全名或本地账号
-
家目录
-
登录之后使用的终端命令
两种机制的密码均是通过这个函数修改,
linux passwd 文件两种存放密码的方式
A. 如果密码直接在 passwd 里,
例如 root:Shheg7V0sDMEk:0:0:root:/root/:/bin/sh
那么 root 后第一个冒号和第二个冒号之间的字段是密码字段,即Shheg7V0sDMEk,其中前两位(Sh
)为盐位,即 crypt
函数需要传入的第二个参数位。经过检验,可以是随机的两位字母或者数字。crypt
函数第一个传参为需要加密的密码。
这个函数传出的,即为总体密码。
B. 如果密码是在/etc/shadow 里,
例如 root:$1$pLQgLnpJ\$8GJuLFXq4W6skKaUsrF.d1:10933:0:99999:7:::
这个时候,盐位即两个 $
之间的字符,包含$,即 $1$pLQgLnpJ\$
,后面的方式,同样是调用 crypt
函数进行加密。
算出新密码后,写入之前的位置即可完成密码替换。
Demo 样例
Linux 修改密码程序如下所示,编译的时候,-lcrypt即可。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <unistd.h>
#include <crypt.h>
int main(void)
{
char \*passwd;
char key[] = "heheha";
passwd = crypt(key, "Sh");
printf("password: %s\n", passwd);
return 0;
}