BASH从阴影到变量获取salt和加密的root密码

时间:2018-01-25 08:57:45

标签: bash passwords root shadow

我正在寻找一种方法来将用户输入的密码与存储在/etc/shadow

中的root用户密码进行比较

我可以使用perl命令执行此操作,但我需要从shadow中获取salt和现有密码以进行比较。

我知道我可以grep /etc/shadow为root,这会产生类似于:

的字符串

mal:$6$23QKDPc5E$SWlkjRWexrXYgc98F.:12825:0:90:5:30:13096:

我想做的是从这个字符串中获取盐 23QKDPc5E 和密码 SWlkjRWexrXYgc98F。到他们自己的变量。

有一种简单的方法吗?

我能想到的唯一方法是将字符串拆分为$,然后将最终结果拆分为:

这将给我两个包含我需要的值的数组,但必须有一个更简洁的方式..

由于

2 个答案:

答案 0 :(得分:2)

在@Viktor Khilin的回答中提出的类似方法,但只发出1个命令:

# Get the algorithm used for generating the password for user "root", first field of the hash in `/etc/shadow`
awk -F[:$] '$1 == "root" {print $3}' /etc/shadow

# Get the SALT, 2nd field of the hash in `/etc/shadow`:   
awk -F[:$] '$1 == "root" {print $4}' /etc/shadow

# get the password hash, 3rd field in `/etc/shadow`:
awk -F[:$] '$1 == "root" {print $5}' /etc/shadow

说明:

/etc/shadow中的哈希字段本身由三个不同的字段组成。它们用'$'分隔,代表:

  1. 某些字符表示用于生成实际哈希的加密哈希机制
  2. 随机生成的盐,以防止彩虹表攻击
  3. 将用户密码与存储的salt相加并通过第一个字段中指定的散列机制运行它产生的散列
  4. 可以找到有关/etc/shadow文件格式的原始来源here(忽略过期的HTTPS证书警告)

答案 1 :(得分:1)

使用awk:

grep root /etc/shadow | awk -F'$' '{print $3}'

输出:

23QKDPc5E


grep root /etc/shadow | awk -F'$' '{print $4}' | awk -F: '{print $1}'

输出:

23QKDPc5E$SWlkjRWexrXYgc98F.

最后代码:

#!/bin/bash

# something you want here...

salt=$(grep root /etc/shadow | awk -F'$' '{print $3}')
password=$(grep root /etc/shadow | awk -F'$' '{print $4}' | awk -F: '{print $1}')
...
echo "${salt}"
echo "${password}"