Linux shadow文件中密码的加密方式

摘要:
2)解析shadow文件中密码字符串的内容对于示例的密码域$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.,我们参考了linux标准源文件passwd.c,在其中的pw_encrypt函数中找到了加密方法。我们发现所谓的加密算法,其实就是用明文密码和一个叫salt的东西通过函数crypt()完成加密。我们登录时输入的明文密码经过上述的演化后与shadow里的密码域进行字符串比较,以此来判断是否允许用户登录。

1)查看shadow文件的内容

cat/etc/shadow

可以得到shadow文件的内容,限于篇幅,我们举例说明:

root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.:14838:0:99999:7:::

其格式为:

{用户名}:{加密后的口令密码}:{口令最后修改时间距原点(1970-1-1)的天数}:{口令最小修改间隔(防止修改口令,如果时限未到,将恢复至旧口令):{口令最大修改间隔}:{口令失效前的警告天数}:{账户不活动天数}:{账号失效天数}:{保留}

【注】:shadow文件为可读文件,普通用户没有读写权限,超级用户拥有读写权限。如果密码字符串为*,则表示系统用户不能被登入;如果字符串为!,则表示用户名被禁用;如果字符串为空,则表示没有密码。

我们可以使用passwd–d用户名清空一个用户的口令密码。

2)解析shadow文件中密码字符串的内容

对于示例的密码域$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.,我们参考了linux标准源文件passwd.c,在其中的pw_encrypt函数中找到了加密方法。

我们发现所谓的加密算法,其实就是用明文密码和一个叫salt的东西通过函数crypt()完成加密。

而所谓的密码域密文也是由三部分组成的,即:$id$salt$encrypted。

【注】:id为1时,采用md5进行加密;

id为5时,采用SHA256进行加密;

id为6时,采用SHA512进行加密

3)数据加密函数crypt()讲解

i.头文件:#define_XOPEN_SOURCE

#include<unistd.h>

ii.函数原型:char*crypt(constchar*key,constchar*salt);

iii.函数说明:crypt()将使用DES演算法将参数key所指的字符串加以编码,key字符串长度仅取前8个字符,超过此长度的字符没有意义。参数salt为两个字符组成的字符串,由a-z、A-Z、0-9,’.’和’/’所组成,用来决定使用4096种不同内建表格的哪一种。函数执行成功后会返回指向编码过的字符串指针,参数key所指向的字符串不会有所改动。编码过的字符串长度为13个字符,前两个字符为参数salt代表的字符串。

iv.返回值:返回一个指向以NULL结尾的密码字符串

v.附加说明:使用GCC编译时需要加上–lcrypt

4)加密参数salt的由来

在我们的示例密码域中salt为Bg1H/4mz,那么它又是如何来的?

我们还是从标准源文件passwd.c中查找答案。在passwd.c中,我们找到了与salt相关的函数crypt_make_salt。

在函数crypt_make_salt中出现了很多的判断条件来选择以何种方式加密(通过id值来判断),但其中对我们最重要的一条语句是gensalt(salt_len)。

我们继续查看了函数staticchar*gensalt(unsignedintsalt_size),才发现原来神秘无比的salt参数只是某个固定长度的随机字符串而已。

5)最终结论

在我们每次改写密码时,都会随机生成一个这样的salt。我们登录时输入的明文密码经过上述的演化后与shadow里的密码域进行字符串比较,以此来判断是否允许用户登录。

【注】:经过上述的分析,我们发现破解linux下的口令也不是什么难事,但前提是你有机会拿到对方的shadow文件。

6)示例代码(测试代码):

#include<pwd.h>
#include<stddef.h>
#include<string.h>
#include<shadow.h>
#include<stdio.h>
#include<unistd.h>
intmain(intargc,char*argv[])

{

if(argc<2)

{

printf("nousrnameinput");

return1;

}

if(geteuid()!=0)

{

fprintf(stderr,"mustbesetuidroot");

return-1;

}

structspwd*shd=getspnam(argv[1]);

if(shd!=NULL)

{

staticcharcrypt_char[80];

strcpy(crypt_char,shd->sp_pwdp);

charsalt[13];

inti=0,j=0;

while(shd->sp_pwdp[i]!='

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇bootstrap添加iframe页【前端】本地调试H5页面方案总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

为什么Android手机总是越用越慢?

根据第三方的调研数据显示,有77%的Android手机用户承认自己曾遭遇过手机变慢的影响,百度搜索“Android+卡慢”,也有超过460万条结果。在业内,Android手机一直有着“越用越慢”的口碑,这个现象甚至超出了硬件范畴——很多中高端Android手机在硬件参数上都优于同一代iPhone,但是它们仍然会在使用半年到一年的时间后进入“欠流畅”的状态—...

Linux下防御ddos攻击

导读 Linux服务器在运营过程中可能会受到黑客攻击,常见的攻击方式有SYN,DDOS等。通过更换IP,查找被攻击的站点可能避开攻击,但是中断服务的时间比较长。比较彻底的解决方法是添置硬件防火墙。不过,硬件防火墙价格比较昂贵。可以考虑利用Linux 系统本身提供的防火墙功能来防御。 SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立...

Linux上安装ZooKeeper并设置开机启动(CentOS7+ZooKeeper3.4.10)

1下载Zookeeper 2安装启动测试        2.1上载压缩文件并解压       2.2新建 zookeeper配置文件       2.3安装JDK       2.4启动zookeeper       2.5查看zookeeper的状态 3将ZooKeeper设置为开机启动(可选)       3.1在init.d目录下新建脚本文件    ...

Linux下librtmp使用及编程实战

  最近想做rtmp的推流、直播的小项目,不想直接使用FFmpeg进行推流,FFmpeg进行推流特别简单,因为它已经将编码以及librtmp都集成好了,没啥意思。FFmpeg推流的例子,在雷神的博客里可以找到。这里主要是基于librmtp,结合libx264进行压缩,进行一些实验,包括三大部分: rtmp流保存 flv文件推流 h264推流 首先是rt...

node中的url和path模块

//path模块 1.Node.js path 模块提供了一些用于处理文件路径的小工具,我们可以通过以下方式引入该模块: var path = require("path") 2.常用方法 ================path.join([...paths]) path.join() 方法使用平台特定的分隔符把全部给定的 path 片段连接到一起,并...

Linux 性能测试工具Lmbench详解

Linux 性能测试工具Lmbench详解 2010-06-04 16:07 佚名 评测中心字号:T|T Lmbench 是一套简易可移植的,符合ANSI/C 标准为UNIX/POSIX 而制定的微型测评工具。一般来说,它衡量两个关键特征:反应时间和带宽。Lmbench 旨在使系统开发者深入了解关键操作的基础成本。 AD:2014WOT全球软件技...