一,用户密码存放在哪里?

  说到这个问题,绝大部分的同学肯定都知道/etc/passwd这个文件,不错,这个文件里存储的就是用户名,密码等信息。

  每一行都是一个account,每一行有7个信息,分别用 : 隔开,从左往右依次是:用户名:加密用户密码:用户id:组id:注释:工作目录:shell目录,这些信息被放在一个叫struct passwd的结构体中统一管理,struct passwd结构体包含以下信息:

struct passwd {

  char *pw_name;  /*用户名*/

  char *pw_passwd;  /*加密用户密码*/

  int pw_uid;      /*用户id*/

  int pw_gid;     /*组id*/

  char *pw_gecos;    /*注释*/

  char *pw_dir;    /*用户主目录*/

  char *pw_shell;    /*shell目录*/

};

但是通过查看/etc/passwd文件内容,发现加密密码一项都用了字符'x'表示。我们理解中的加密密码应该是一串看不出任何逻辑的字符才对,怎么会是一个‘x’呢?

二,/etc/shadow文件

  上面一个内容中最后提出了一个疑惑,'x'的来由。这就是一个简单的历史遗留问题,早期的posix版本中'x'这个位置确实存放的是加密密码,也就是一串没有任何逻辑的字符,这串加密密码采用的是单向加密算法进行加密,也就是说无法通过反向破解得到密码,我想这也是早期会直接将加密密码放在/etc/passwd的原因吧。如果我们生的再早个十几年,就会直接在/etc/passwd中看到加密密码了。

  但是/etc/passwd这个文件在同一超级管理员下的各个账户里是透明的,也就是说,谁都可以访问到/etc/passwd这个文件并且获取到那一串加密密码。这样有啥用,密码不还是单向加密的吗?尽管不可破解,但是仍然存在着根据用户的身份等信息推测密码经相同的加密处理后与原来的加密密码进行对比从而获取密码的风险。为了避免这种情况,现在的某些系统将加密密码存放在一个shadow(阴影)文件中,并且给这个文件设置为仅超级管理员可见,而/etc/passwd密码的位置仅仅用一个'x'意思一下。这个shadow文件就是/etc/shadow.

mbl:$1$Y/1ISiCx$S5mv/6lKRM1ZobXdP8629LsI2DsNWJpkAUFiO8PlZTN741DoyI6cvOFQVGluS/dF7tCadfACwhbfcFt5v0iK9Y8bp:18307:0:99999:7:::

  左边第二个就是加密密码所在位置,$1$Y/1ISiCx$S5mv/6lKRM1ZobXdP8629LsI2DsNWJpkAUFiO8PlZTN741DoyI6cvOFQVGluS/dF7tCadfACwhbfcFt5v0iK9Y8bp。前半部分的$1$Y/1ISiCx$是盐值,从官方文档中我们可以知道用户密码经过了glibc中的crypt算法的处理,处理后会形成盐值后面的一串字符串,对于相同的密码,哈希算法加密出来的字符串也相同,因此,盐值的存在就是为了区分这些相同密码形成的相同加密码 同时也为破解增加了难度。

  /etc/shadow中的各个信息被struct spwd这个结构体管理。感兴趣可以了解一下。

  有了/etc/shadow,安全性就大大提高。想要获取加密密码?得先知道超级管理员密码。

  如果可以成功的撸到crypt加密算法,下一节的内容就是crypt的算法实现了。

三,小福利

(1)先领略一下crypt的风采吧。

Python3:

C: 编译的时候要带上-lcrypt

(2)上面说到了/etc/passwd这个文件,自己编写个程序输出这里面的内容吧

  #include <pwd.h>
#include <cstring>
#include <cstdio>
void printPwRecord(){
struct passwd *ptr = nullptr;
setpwent();
while((ptr = getpwent()) != nullptr){
printf("%s:%s:%u:%u:%s:%s:%s\n", ptr->pw_name, ptr->pw_passwd, ptr->pw
, ptr->pw_dir, ptr->pw_shell);
}
endpwent();
}
int main(){
printPwRecord();
}

这段程序用到了三个函数,setpwent();  getpwent();  endpwent();

#include <sys/types.h>
       #include <pwd.h>

struct passwd *getpwent(void);

void setpwent(void);

void endpwent(void);

这三个函数用于访问password file,比如/etc/passwd.
getpwent函数返回文件的的下一个记录项,setpwent函数定位到文件开始处,endpwent函数关闭这些文件。注意:在getpwent之前调用setpwent是自我保护性的措施,以便在调用者在此之前已经调用getpwent打开了有关文件的情况下,重新使他们定位到文件开始处。最后要调用endpwent关闭这些文件。

与passwd相关的还有getpwuid和getpwnam这两个函数,

#include <sys/types.h>

  #include <pwd.h>

  struct passwd *getpwnam(const char *name);

  struct passwd *getpwuid(uid_t uid);

分别通过用户名/用户id获取该指定用户的struct passwd结构体,通过这个结构体可以访问该用户信息。

经常登录Linux,用户密码背后的知识了解一下的更多相关文章

  1. 修改linux用户密码

    对于初学者来说,如何修改linux用户密码也不是件容易的事,其实非常简单,下面举例说明: 如果是以root身份登录,修改root密码.只要输入 passwd 就会出现: New password:  ...

  2. Linux用户密码策略

    使用Linux快三年了,从未想过Linux用户密码策略,从未把一本Linux的书从头看到尾(上学时的教材除外),故不知书上有无介绍,直到最近参加公司的信息安全稽核会议后才开始考虑Linux用户密码策略 ...

  3. Linux用户密码期限修改

    今天有开发报故,sftp无法登录.检查服务都是正常的,之前3月份也出现过此问题,当时忙没有注意,现在看每3个月出现问题.这才想到是密码过期导致的. 先重置用户密码,发现过期日志为Oct 08, 201 ...

  4. Linux用户密码文件/etc/shadow相关

    (1).密码文件 [root@xuexi ~]# head -3 /etc/shadow root:$6$kcgcu794R0VP3fDL$aYN8XUbtWvZ4QQtT2xVW.N2CgE3YLP ...

  5. 忘记Linux用户密码怎么办?

           忘记密码解决办法(centos6.5版本) 1.开机时,在此页面一直按ESC 2.然后进入以下界面时,按一下字母  “E”    键 (3)再按字母   “E”   键 (4)之后 输入 ...

  6. linux用户密码过期导致命令执行失败

    背景介绍: 使用zabbix调用系统命令,检查时间同步,发现一直在报错,root 用户执行无异常,问题还是出现zabbix用户上面. [zabbix@test-10-12 ~]$ sudo ntpda ...

  7. Linux用户密码重置方法

    方法一: 启动时,随便按一个键,空格即可(不能是回车),让其停留在如下界面 按e编辑 在UTF-8后面添加init=/bin/sh init=/bin/sh 根据上面提示,按Ctrl+x启动得下图 输 ...

  8. linux 用户密码过期时间

    /etc/login.defs    全局配置文件,即当新建用户时的默认设置 PASS_MIN_DAYS  5    #最近一次密码更新的日期+0 ,即允许用户更改自己的密码的日期 PASS_MAX_ ...

  9. linux用户密码生成

    linux账户保存在/etc/passwd,密码保存在/etc/shadow. 通过man 5 passwd,man 5 shadow可查看文件中各字段含义. encrypted password   ...

随机推荐

  1. react-native app 屏幕适配方案(按照设计稿像素大小写就行)

    import React, { Component,PropTypes } from 'react'; import { Dimensions,PixelRatio,Platform,StatusBa ...

  2. Js数组代替写循环的几个方法

    简介 循环是个不可避免的结构,而且不好复用,同时循环还很难加入其他操作中.更麻烦的是,使用循环就意味着在每一个新的迭代中有更多变化需要响应. 上了循环的控制结构会使代码看起来变得复杂,故而这里提几个替 ...

  3. win10安装docker 和 splash

    参考链接1:https://www.cnblogs.com/321lxl/p/9536616.html 参考链接2:https://blog.csdn.net/qq_18831501/article/ ...

  4. gcc错误[Error] ld returned 1 exit status

    出现这个错误的原因是:(目前遇见两种情况了) 你的编译器正在执行刚刚的程序还没关:小黑框还在. 解决措施:关闭就好. 定义的函数和调用的函数名字不一样,也会造成产生这种错误!!!代码如下: bool ...

  5. vlc 播放器的点播和广播服务

    vlc 是一个开源的,同时跨平台的播放器.在研究 rtsp 协议时发现,它同时还是一个强大的流媒体服务器 VLM VLM(VideoLAN Manager) 在 vlc 中是一个小型的媒体管理器,它能 ...

  6. IE8使用chrome内核渲染

    1  第一步  https://download.csdn.net/download/qq_34626479/11223448  下载chrome frame安装包; 2  第二步  网页头部添加一行 ...

  7. 一起了解 .Net Foundation 项目 No.21

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. UWP Community ...

  8. Flutter 学习路线图

    Flutter 学习路线图 如果你真的觉得很难,坚持不了了,那就放弃,既然放弃了就不要抱怨没有得到. 选择你热爱的,坚持你选择的,不抱怨放弃的. 前言 Flutter越来越火,学习Flutter的人越 ...

  9. 结合生活,剖析《生产者消费者模型》-java多线程(一)

    博客园的园友们好,看博客园上各位大佬的文章,已陪伴了我程序员职业的三年, 如今自己同样希望能把自己从小白到菜鸟的成长过程分享给大家.不定期更新!!! 首先我本人智商不高,理解问题十分吃力,完全不属于天 ...

  10. TensorFlow 基本变量定义,基本操作,矩阵基本操作

    使用 TensorFlow 进行基本操作的实例,这个实例主要是使用 TensorFlow 进行了加法运算. 包括使用 constant 常量进行加法运算和使用 placeholder 进行变量加法运算 ...