通过编写程序修改 linux 登陆密码

本文介绍在嵌入式Linux系统中,如何绕过passwd命令限制,使用crypt函数修改用户登录密码。文章详细解析了/etc/passwd和/etc/shadow文件中密码的存储方式,并提供了一个修改密码的程序示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

最近本组有需求需要通过程序能够修改用户的登陆密码。在完整的 linux 系统中,可以通过 passwd 指令实现,但是嵌入式系统中一般为了精简,不会将此命令暴露出来,所以我们只能使用别的方式修改登陆密码。

linux passwd 密码构成

root:Shheg7V0sDMEk:0:0:root:/root/:/bin/sh

/etc/passwd 存放用户信息,由 6 个冒号组成 7 个信息。

  1. 用户名

  2. 密码(x 表示加密密码)

  3. UID(用户标识)

  4. GID(组标识)

  5. 用户全名或本地账号

  6. 家目录

  7. 登录之后使用的终端命令

    两种机制的密码均是通过这个函数修改,

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值