Ubuntu系统中/etc目录下有三个和用户登录访问控制相关的文件:passwd、shadow、group。以前比较老的Unix系统将经过哈希处理的密码直接放在passwd文件中,现在的*nix则把经过处理的密码放在shadow这个文件中,这三个文件的用途可以参考:http://blog.sina.com.cn/s/blog_5edae1a101017gfn.html

打开/etc/shadow文件内容如下图:

可以看到从“$6$”开始到“GJr..”结束这一段字符是经过哈希处理的用户密码,那么我们现在想知道这个字符串是如何生成的,我们查看了Ubuntu官方的文档:

shadow文件说明:http://manpages.ubuntu.com/manpages/karmic/man5/shadow.5.html

crypt加密算法说明:http://manpages.ubuntu.com/manpages/karmic/man3/crypt.3.html

从官方文档中我们可以知道用户密码经过了glibc中的crypt算法的处理,“$6$3rhg9.la$”是哈希过程中使用到的盐值,那么盐值有什么作用呢?我们知道对于一个已知的哈希算法和一个固定的字符串来说,其哈希的结果是相同的,那么假设一个系统中有很多用户,那么其中的一些用户就可能使用相同的密码,例如两人都使用了“123456”作为登陆密码,那么在不使用盐值的情况下,经过处理的密码字符串就是一样的。虽然“非法***者”无法直接从经过处理的字符串获得明文密码,但仍然可以知道有两个人使用了相同的密码。为了避免这种情况,我们就可以在对用户的密码进行哈希时在原始密码的后边拼上一个盐值(m//salt),这样做的好处有两个:一方面由于盐值随机产生,避免相同密码产生同意的哈希值;另一方面增加了***者暴力破解的计算复杂度(增加了2^|salt|倍)。“$6$3rhg9.la$”分为两个部分:“6”和“3rhg9.la”,第一个参数是哈希算法选择参数,在官方文档中已经提到,第二个是随机产生的字符串。

python自带的crypt算法可以调用glibc中的crypt算法,我们打开python源文件中lib目录下的crypt.py文件可以看到python对glibc中的crypt算法的调用过程:

def crypt(word, salt=None):"""Return a string representing the one-way hash of a password, with a saltprepended.If ``salt`` is not specified or is ``None``, the strongestavailable method will be selected and a salt generated.  Otherwise,``salt`` may be one of the ``crypt.METHOD_*`` values, or a string asreturned by ``crypt.mksalt()``."""if salt is None or isinstance(salt, _Method):salt = mksalt(salt)return _crypt.crypt(word, salt)

打开glibc源文件中crypt目录下的crypt-entry.c文件,我们可以看到根据盐值前三个字符进行哈希算法选择的代码:

/* Define our magic string to mark salt for MD5 encryptionreplacement.  This is meant to be the same as for other MD5 basedencryption implementations.  */
static const char md5_salt_prefix[] = "$1$";
/* Magic string for SHA256 encryption.  */
static const char sha256_salt_prefix[] = "$5$";
/* Magic string for SHA512 encryption.  */
static const char sha512_salt_prefix[] = "$6$";
/* For use by the old, non-reentrant routines (crypt/encrypt/setkey)  */
extern struct crypt_data _ufc_foobar;

在测试过程中最开始下载的是glibc2.6,这个版本并没有$5$和$6$对应的sha256/sha512算法,只有MD5,然后下载了最新的glibc2.18版本才看到了这两个算法,可以猜出使用glibc2.6版本及以前的版本的linux系统中,shadow文件并不是现在这样的。本Ubuntu系统的gblic版本是2.11(ldd --version查看),该版本glibc也支持sha256/sha512。我们给出的例子里前三个字符是“$6$”,我们可以知道系统使用的哈希算法是sha512。由于python调用的是glibc中的crypt算法,所以自然可以知道在windows平台下python的这个算法是无法调用的。现在使用python写一些脚本来测试一下:

在crypt函数中输入两个参数,一个是我们的登陆密码,另一个是盐值,我们可以看到输出的结果和shadow文件中经过处理的密码字符串相同。

shadow文件默认只能由root用户访问,一般用户没有访问权限,非法***者通过一定途径获得该文件后通过暴力尝试密码就有可能获得原始的明文密码,所以用户在设置密码的时候尽量包含多种字符(大小写、数字、特殊符号)并超过一定的长度,以此来提升系统的安全性。

转载于:https://blog.51cto.com/ciphertext/1275485

探究Ubuntu如何存储用户登录密码相关推荐

  1. 利用 John the Ripper 破解用户登录密码

    一.什么是 John the Ripper ? 看到这个标题,想必大家都很好奇,John the Ripper 是个什么东西呢?如果直译其名字的话就是: John 的撕裂者(工具). 相比大家都会觉得 ...

  2. 网站该如何存储用户的密码

    2019独角兽企业重金招聘Python工程师标准>>> 对那些有用户系统的网站来说,如果存储用户的密码是个问题. 大家都知道不能明文存储,这样一旦被脱了裤子,后果很严重, 简单的md ...

  3. 修改ranger ui的admin用户登录密码踩坑小记

    修改的ranger ui的admin用户登录密码时,需要在ranger的配置里把admin_password改成一样的,否则hdfs的namenode在使用admin时启动不起来,异常如下: Trac ...

  4. linux 去掉登陆密码吗,Linux 清除 Windows用户登录密码

    Linux 清除 Windows用户登录密码 [toc] 一. 环境 Windows 系统: Windows 10 win10.png Linux 系统: Parrot Linux parrot_se ...

  5. Ubuntu 12.04忘记登录密码及修改密码

    1,在启动的时候,上下移动,选中修复模式"Ubuntu-x.x.xx.xx-generic (recovery mode)",然后按e(记住,是选中,选中后按E,不需要按回车) 2 ...

  6. Ubuntu忘记超级用户root密码,重新设置密码

    Ubuntu忘记超级用户root密码,重新设置密码 Ubuntu版本:Ubuntu 16.04.3 LTS 1启动系统,在启动过程中,反复按Esc键或者shift键(本人亲测反复按或者长按都可以,没必 ...

  7. 银河麒麟V10-桌面版 用户登录密码遗忘解决过程

    银河麒麟V10-桌面版 用户登录密码遗忘解决过程 系统版本: 银河麒麟V10-桌面版,内核:Linux-4.4.131 解决办法: 重启系统,进单用户模式进行修改. 解决步骤: 第一步:重启操作系统, ...

  8. 苹果用计算机知道密码,怎么查看苹果系统电脑中safari浏览器内的用户登录密码...

    怎么查看苹果系统电脑中safari浏览器内的用户登录密码 随着科技的发展,电脑已经成为人们日常生活中必不可少的工具,当我们在使用苹果电脑中的safari浏览器浏览网页时,系统会自动保存账号密码,那么我 ...

  9. linux用户登录报密码不对,Linux用户登录密码的生成

    一.从自动化需求说起 如何生成一个Linux用户登录密码?可能有人会说用passwd生成.的确,passwd命令能够帮助我们重置用户登录密码,但是这并没有解答如何生成一个Linux用户登录密码的疑问. ...

最新文章

  1. SSH实现论坛BBS系统
  2. 换血吃药改基因,硅谷富豪们想用钱收买死神丨视频
  3. 【图像处理】——图像滤波(Python+opencv实现三种方法:均值滤波、中值滤波、高斯滤波等)
  4. 【洛谷 - P3376 】【模板】网络最大流
  5. MySql5.7 直接拷贝数据文件后出现table xxx doesn’t exist
  6. Spring - DI循环依赖
  7. Python django model 插入新增一条数据,得到create返回主键值 id
  8. MyCat分片规则之按自然月分片
  9. Java开发支付宝支付功能
  10. C语言程序设计中十全十美,21世纪高校计算机应用技术系列规划教材 C语言程序设计-潭浩强主编 林小茶编著.pdf...
  11. sumo 教程——高速公路
  12. 关于socket阻塞与非阻塞情况下的recv、seng、read、write返回值问题
  13. 挺进商用车自动驾驶,德赛西威与MAXIEYE联合发布“九逵计划”
  14. nested renamer is not supported
  15. 计算机毕设 SSM线上少儿编程系统 在线少儿编程学习系统 少儿编程教育课程平台Java
  16. 电影院里电影票和座位号的关系
  17. [网络安全自学篇] 九十一.阿里云搭建LNMP环境及实现PHP自定义网站IP访问 (1)
  18. Spark数据分析之第5课
  19. 一文教你搞懂C语言的Q格式使用
  20. promise和async用法及区别(详解)

热门文章

  1. 易语言 存储过程 mysql_在易语言中调用MS SQL SERVER数据库存储过程(Transact-SQL)方法总结...
  2. dhcp获取i需要trunk_Cisco三层交换上给不同Vlan配置不同的DHCP
  3. 在设计四人抢答器中灯全亮_数字电子技术课程设计报告(四人抢答器).doc
  4. matlab分析电池特性,基于Matlab_Simulink的光伏电池特性仿真研究
  5. php怎么将网页另存为mht代码,mht转html代码(php)
  6. 图解TCPIP-传输层 TCP报文
  7. 3.9 训练一个 Softmax 分类器
  8. http.server模块
  9. 网络安全之等级保护问题集
  10. 使用vSAN RVC进一步了解vSAN环境