关于Linux用户登录密码的生成

一、从自动化需求说起

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

对于这个问题,秉承着实用主义的精神,我原本也不会去深究。毕竟,安装的时候会设置密码,安装完毕后能通过passwd命令重置密码,学会这两点后已满足一般的需求已经绰绰有余了。

但是,对于自动化而言,知道以上的两点是不够的。Linux的自动化安装过程中,设置用户登录密码这事,肯定不能有人为干预,否则谈什么自动化。操作系统安装完毕后,也有可能会有重置用户密码的自动化需求,此时使用passwd命令来重置用户密码,也不见得是最佳的选择。

如果明白了密码的生成机制,那么这个自动化需求的难题也就迎刃而解了。

二、密码生成理论

有Linux基础的人一定知道,Linux的用户登录密码信息是存放在/etc/shadow文件当中的,并且该文件只有root用户能够访问。以下会以voidint这个用户为例,看一下这个用户的密码信息。


  1. $ sudo cat /etc/shadow | grep voidint 
  2.  
  3. [sudo] password for voidint: 
  4.  
  5. voidint:$6$3kheX/Vg$TGum9JEjfmGsj8Mfk3SUY/d/bWkJgnRimCxoaDTX7wcgrraYvU.fiziEUdpDglWc58uPZqWJhKNjiXayP9Q6b0:16892::::::  

很明显,这个字符串被:符号分隔成了9段。我们这里只关注前两段,至于每一段具体的含义,可以戳这里自行阅读。第一段,是用户名称。第二段,即为用户密码。其实密码这种称呼并不准确。相对准确的说法是,用户密码明文经过某种哈希算法计算所获得的密文。但是,鉴于这个相对准确的说法实在太长太拗口,不便于表达。因此,以下提到的密码在无特别说明情况下,一律指的是密码明文的密文。

言归正传,看到这里相信好多人会和我有一样的思考: 是不是只要知道了密码生成的算法,并按照此算法生成一个满足Linux要求的密码,再把密码覆盖这个第二段的内容,那么用户密码就被重置了吗?

仔细看这段密码,会发现它是由$xxx$xxx$xxx的格式构成,即由$符号分隔的3端字符串构成。查阅资料后得知,这个格式可以进一步概括为$id$salt$encrypted。简要说明下$id$salt$encrypted中各个部分的含义:

  • id: 加密(确切说是哈希)所用算法的代号。
ID Method
1 MD5
2a Blowfish (not in mainline glibc; added in some Linux distributions)
5 SHA-256 (since glibc 2.7)
6 SHA-512 (since glibc 2.7)
  • salt: 由程序随机生成的字符串,即盐)。
  • encrypted: 用户密码明文字符串加盐后使用哈希算法所得的哈希值,即哈希(明文+盐)。

特别说明

资料中还提到了另外一种形式的密码——$id$rounds=yyy$salt$encrypted。其中,盐的部分换成了rounds=yyy。yyy是一个由用户(调用方)提供的[1000, 999999999]之间的整数。

三、密码生成实践

知道了上面这部分基础知识,那么接下来就是理论指导实践的环节了。具体可以借助什么工具来生成密码呢?这里使用的grub-crypt工具。你可以在某个Linux发行版中安装这个工具,也可以使用我提供的这个dockerfile。

  • 使用sha512算法生成密码 

  1. $ grub-crypt --sha-512 
  2. Password: 
  3. Retype password: 
  4. $6$r1jcut3Crl8bSIMo$XfKnrl4Ykzk2KPQ59MCXcUef9OjZWoZrIp7aeWwnCzIVQY1p/G1EiJQE4DYFej783NlvR5KtKYXs4P/hQaVst.  
  • 将生成的密码写入/etc/shadow文件中(该文件只有root用户才有权限读写,若root也无权限,则赋予600权限即可)

  1. $ sudo cat /etc/shadow | grep voidint 
  2.  
  3. voidint:$6$r1jcut3Crl8bSIMo$XfKnrl4Ykzk2KPQ59MCXcUef9OjZWoZrIp7aeWwnCzIVQY1p/G1EiJQE4DYFej783NlvR5KtKYXs4P/hQaVst.:16892::::::  
  • 退出当前用户并使用新修改的密码登录

四、参考

原文发布时间为:2017-10-31 

本文作者:voidint

本文来自合作伙伴“51CTO”,了解相关信息可以关注。

时间: 2024-09-10 10:01:05

关于Linux用户登录密码的生成的相关文章

linux-Fedora 用户登录密码正确但无法登陆

问题描述 Fedora 用户登录密码正确但无法登陆 我使用的virtualbox虚拟机安装的Fedora20,但是用户登录时明明密码输入正确,但是提示无法奏效是怎么回事,Linux小白一个,刚准备用,请指教![CSDN移动问答][1]

使用SSH1整合是如何修改用户登录密码的?

问题描述 使用SSH1整合是如何修改用户登录密码的? 解决方案 解决方案二:框架打好之后,在dao层和biz层处理相关业务.修改密码:传入当前用户的id值,拿到用户详细信息,再执行修改就可以了.解决方案三:该回复于2011-05-03 17:01:26被版主删除解决方案四:引用1楼xingfuzhijianxia的回复: 框架打好之后,在dao层和biz层处理相关业务.修改密码:传入当前用户的id值,拿到用户详细信息,再执行修改就可以了. 顶下,这个东西要看你是哪里不懂了,mvc全不懂,那你还是

linux中忘记root用户登录密码解决方法

1.在Grub的引导装载程序菜单上,选择你要进入的条目,键入 "e" 来进入编辑模式: 2.在第二行(类似于kernel /vmlinuz-2.6.15 ro root=/dev/hda2 ),键入"e"进入编辑模式: 3.在句末加上"init=/bin/bash",回车: 4.按"b"启动系统. 这样我们即可获得一个bash的shell,进入shell后,根分区的挂载模式默认是只读,我们要将其改为可写,否则不能更改root密

linux中ftp用户登录密码忘记了怎么修改

先来熟悉一下 vsftp 命令: 启动vsftp用命令:  1.service vsftpd start  重启vsftp用: 1.service vsftpd restart 添加用户用: useradd -m 111cn, 默认是在/home 目录下建立一个用户111cn, 如果用户存在会有提示. 指定目录用这个命令(useradd -d)如:useradd -d /home/baidu -s /bin/sh 111cn, 然后用语句:passwd 111cn 就可以为新建的用户设置密码.

oracle修改用户登录密码

1.使用oracle用户登录,连接数据库 [oracle@wuzj ~]$ sqlplus /nolog SQL*Plus: Release 10.2.0.1.0 - Production on Thu Feb 26 12:06:29 2009 Copyright (c) 1982, 2005, Oracle. All rights reserved. SQL> conn /as sysdba Connected. //查看用户 SQL> select username,password fr

Mac系统怎么更改用户登录密码

  1.点击菜单栏上方的苹果小图标,进入"系统偏好设置" 2.在打开的窗口中,找到"用户与群组" 3.在左侧选中你想要更改密码的账户,在左侧点击"更改密码" 4.输入旧密码和新密码,点击确认就可以修改登录密码了.

Windows网络用户登录密码的猜解

Windows网络用户密码猜解算法的主要思想是:利用Windows提供的窗口枚举函数EnumWindows ()找到网络登录窗口.利用子窗口枚举函数EnumChildWindows ()或GetNext-DlgTabItem()和GetWindowLong()定位网络登录窗口上的各个控件.利用SendDlgItemMessage()或SetDlgItemText()来输入用户名及密码.利用SendMessage()发送"确定"消息.这样一来,就利用程序完成了整个网络登录过程.在重复这个

更改linux用户登录shell的操作方法_linux shell

1.查看机器安装了哪些shell? 有两种方法可以查看. 第一种: [rocrocket@wupengchong ~]$ chsh -l  /bin/sh /bin/bash /sbin/nologin /bin/zsh 第二种: [rocrocket@wupengchong ~]$ cat /etc/shells  /bin/sh /bin/bash /sbin/nologin /bin/zsh 其实chsh -l也是来查看这个文件. 2.查看当前正在使用的shell是哪个? [rocrock

centos 7 修改用户登录密码的步骤

rhel7/centos7 使用了grub2代替了之前的grub引导,由init初始化更换成了systemd初始化.随之带来的root密码在找回时也和之前操作不同.具体如下: 1. 启动系统,并在GRUB2启动屏显时,按下e键进入编辑模式 2. 在kernel 引导行所在参数行尾添加以下内容  init=/bin/sh   3. 按Ctrl+x启动到shell引导进入单用户模式   4. 挂载根分区为可读写模式  mount -o remount,rw / 此时就可以通过passwd修改密码 ,