Linux系统编程:(4)用户与组、密码加密与认证

本文详细介绍了Linux系统中的用户与组管理,包括密码文件/etc/passwd、shadow密码文件/etc/shadow、组文件/etc/group的内容和作用。讲解了如何获取用户与组信息,以及密码加密和用户认证的过程,强调了密码安全的重要性。

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

一、用户与组

在讨论进程凭证之前,我们先来搞清楚用户与组的概念。每个用户都拥有一个唯一的用户名和一个与之相关的数值型用户标识符(UID),一个用户可以隶属于一个或者多个组。每个组也都有唯一的名称和一个组标识符(GID)。用户与组的主要用途包括以下两个方面:确定各种系统资源的所有权对赋予进程访问上述资源的权限加以控制

1. 密码文件:/etc/passwd

在这里插入图片描述
针对系统中每个用户账号,系统密码文件/etc/passwd会专列一行进行描述,每行有7个字段,分别代表以下所述:

  • 登录名:被视为人类可读的标识符,与数字用户标识符对应
  • 经过加密的密码:长度13字符,超过长度不允许登录,如果系统启用shadow密码,系统不会在/etc/passwd文件中解析该字段,以"x"字符占位,经过加密处理的密码实际上存储到shadow密码文件中。如果/etc/passwd文件中密码字段为空,该账户就无需密码登录,即便是启用了shadow密码
  • 用户ID(UID):用户数值型ID,允许同一用户ID对应多个不同的用户名,这样多个用户便可以以不同的密码访问相同的资源。
  • 组ID(GID)
  • 注释:描述性文字
  • 主目录:用户登录后所处的初始路径
  • 登录shell:一般是/bin/bash

2. shadowm密码文件:/etc/shadow

在unix中,之前/etc/passwd中维护所有的用户信息,包括加密处理的密码,因为许多非特权级别系统工具需要读取密码文件中其他的信息,密码文件不得不对所有的用户开放读取权限,这就为密码破解工具提供了可乘之机,他们可以利用同样的工具将可能的密码经过加密得出的加密密码与/etc/passwd中对应的加密密码比对,从而有可能获取密码。为了防止类似攻击,/etc/shadow出现了。
其理念是:用户的所有非敏感信息存放于“人人可读”的密码文件中,而经过加密处理的密码则有shadow密码文件单独维护,仅供具有特权的程序读取。

/etc/shadow 文件内容
登录名:经过加密的密码:其他字段

3. 组文件:/etc/group

系统中的每个组在组文件/etc/group中都对应着一条记录,每条记录包含4个字段。

组名:加密密码:组ID:用户列表在这里插入图片描述

4. 获取用户与组的信息

  • 从密码文件/etc/passwd中获取记录
    在这里插入图片描述
    上述函数分别以登录名和UID为参数,返回密码文件中对应的记录信息:
    在这里插入图片描述
    仅当未启用shadow密码的情况下,pw_passwd字段才会包含有效信息。确定shadow密码是否启用,可以在调用getpwnam(name)之后,紧接着调用getspnam(name),看看是否会返回一条shadow密码记录。

注意: getpwnam和getpwuid返回的指针指向由静态分配而成的内存,故二者不可重入。因为getpw函数在程序中自定义一块静态存储区,每调用一次getpw函数,这个静态存储区就会被重写一次,比如以下代码示例:

int main(int argc,char *argv[]) {
   
	struct passwd *mistr;
    struct passwd *rootstr;

    if(NULL == (mistr=getpwnam("michael"))<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值