手动为/ etc / shadow生成密码


Answers:


126

您可以使用以下命令来实现相同的目的:

方法1(md5,sha256,sha512)

openssl passwd -6 -salt xyz  yourpass

注意:传递-1将生成MD5密码,-5SHA256和-6SHA512(推荐)

方法2(md5,sha256,sha512)

mkpasswd --method=SHA-512 --stdin

方法接受md5sha-256sha-512

方法3(des,md5,sha256,sha512)

如@tink所建议,我们可以使用chpasswd来更新密码:

echo "username:password" | chpasswd 

或者,您可以通过使用加密的密码chpasswd。首先使用以下命令生成它:

perl -e 'print crypt("YourPasswd", "salt", "sha512"),"\n"'

然后,您可以使用生成的密码进行更新:

echo "username:encryptedPassWd"  | chpasswd -e

我们可以使用此加密密码来创建一个具有密码的新用户,例如:

useradd -p 'encryptedPassWd'  username

3
使用时chpasswd -e,请确保在您echo输入的字符串上使用单引号。否则,如果有$或其他特殊字符,则不会按字面意义对待它们。
Zags

4
请注意,这些将最终出现在您的shell历史记录中。我会使用以下openssl passwd -1方法:1)并没有结束,2)为您生成了随机盐(这也没有出现在shell历史中)。
Ztyx

1
openssl passwd任何试图弄清楚该-1选项功能的人的文档资料
CivFan 2015年

4
对于SHA-512哈希:python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'- 来自相关的ServerFault问题
CivFan 2015年

9
上面的方法1)和2)使用MD5进行哈希处理。由于存在哈希冲突,因此不再将MD5视为最佳实践。使用方法3)或unix.stackexchange.com/a/198906/10911中描述的方法
Ztyx

36

在Ubuntu 12.04上,有mkpasswd(来自whois软件包):过度功能化的前端到crypt(3)

mkpasswd  -m sha-512 -S saltsalt -s <<< YourPass

哪里:

  • -m=使用TYPE方法计算密码。如果TYPE是帮助,则将打印可用的方法。
  • -S =用盐。

例如

$ mkpasswd -m help

-s = Read password from stdin

8
无需指定盐,mkpasswd负责生成随机盐。
To마SE 2016年

1
无论如何,从mkpasswd复制到/ etc / passwd的生成密码始终会失败。有没有办法检查由mkpasswd创建的哈希是否正确?
CMCDragonkai

@CMCDragonkai:错误的问题。您需要问您的系统期望什么。
user3183018 '18

1
@To마SE:控制盐有时很有用。在测试将盐存储在单独商店中的Web应用的密码哈希生成时,我曾用过它。例如,MySQL DB中的哈希密码,Redis中的每个用户盐。
user3183018 '18

15

该解决方案具有以下优点:

  • 无需额外安装
  • 不将密码存储在您的shell历史记录中
  • 为您生成随机盐
  • 使用现代的,强大的哈希算法SHA-512
  • 重新提示输入密码,以免出错。

    $ python3 -c "from getpass import getpass; from crypt import *; \
        p=getpass(); print('\n'+crypt(p, METHOD_SHA512)) \
        if p==getpass('Please repeat: ') else print('\nFailed repeating.')"
    

参考文献


3

对于那些没有基于Debian的系统的人。Python3也可以正常工作。

python3 -c 'import crypt; print(crypt.crypt("test"))'

注意:字符串“ test”是我们作为加密字符串生成的密码。


由于某些原因,crypt.mksalt在为生成密码时,使用不起作用/etc/shadow。但是@ Alex131089的方法有效!
maulinglawns

在我注意到此评论之前,只是浪费1.5小时尝试这种方法。有人可以删除它吗?我还不能投票。
米哈尔˚F

1
@MichałF看来这没用,因为加盐没有正确完成。感谢您指出了这一点。我删除了盐,是因为盐析取决于操作系统,并且在我的答案中考虑所有操作系统范围是不切实际的。您应该使用@RahulPatil概述的方法1,因为它允许您使用盐腌法并且openssl是一个非常通用的工具。
格雷格

不建议这样做,因为它会将密码保留在您的Shell历史记录中。
马克·斯托斯伯格

我的意思是,您始终可以从外壳程序历史记录中清除cmd
Greg,

3

目前方法都不是我接受-他们要么通过在命令行上的密码(这在我的壳的历史结束了),需要额外的工具(安装python3makepasswd),使用硬编码盐或使用旧的散列技术。

提示输入密码后,此方法将生成SHA-512哈希,并使用随机盐。

没有任何非标准库的利用Python 2的方法:

python2 -c 'import crypt, getpass,os,base64; print crypt.crypt(getpass.getpass(), "$6$"+base64.b64encode(os.urandom(16))+"$")'

要在没有提示的情况下执行此操作:(这会将您的密码保留在命令历史记录中)

python2 -c 'import crypt, os,base64; print crypt.crypt("MyPassword", "$6$"+base64.b64encode(os.urandom(16))+"$")'

2
为了避免将密码保留在命令历史记录中,您可以(至少对于bash而言)将环境变量HISTCONTROL设置为“ ignorespace”,然后在命令前添加一个前导空格。
adam820 '18 -10-4

@ adam820:那是一种方法...它仍然会在ps命令运行的一秒钟内显示在输出中。(最安全的方法是使用提示输入密码的版本)
Gert van den Berg,

2

在我的情况下,RHEL6中的openssland chpasswd -e对不起作用。结合openssl passwdusermod -p指挥完成了这项工作。

生成密码的哈希值以及盐值:

$ openssl passwd -1  -salt 5RPVAd clear-text-passwd43

$1$5RPVAd$vgsoSANybLDepv2ETcUH7.

然后,将加密的字符串复制到usermod。确保用单引号引起来。

$ usermod -p '$1$5RPVAd$vgsoSANybLDepv2ETcUH7.' root

在影子文件中签出。

$ grep root /etc/shadow

root:$1$5RPVAd$vgsoSANybLDepv2ETcUH7.:17774:0:99999:7:::

1

生成密码的另一种方法是使用该openssl工具。

生成MD5密码

openssl passwd -1 -salt SaltSalt SecretPassword
# output: $1$SaltSalt$FSYmvnuDuSP883uWgYBXW/

生成DES密码

openssl passwd -crypt -salt XR SuprScrt
# output: XR1dOp2EVMph2

3
这与Rahul Patil的答案中的方法1有何不同?请注意,绝对应该使用基于DES的旧密码哈希算法一方面,它仅支持最多八个字节的密码,这在当今已经远远不够。
2016年

3
引用斯诺登的话:“假设您的对手每秒能够猜测一万亿次。” 拥有并非完全不合理的70个字符的字符集和完全随机的密码,这就是576秒-不到十分钟。即使是对付能力较弱但坚定的对手,这也是可悲的
CVn

这不是很安全,因为MD5和DES ...
AdamKalisz

感谢您作为显示如何加密DES密码的唯一答案!对于尝试覆盖IP摄像机固件的根密码非常有用。
恶意

1

扩展了对u150825和Gert van den Berg的批评,我发现自己需要一些相对灵活的东西,以适应具有不同自动化系统的不同情况。我决定将自己的有用脚本添加到自己的小程序库中,并将其编写。它仅使用来自python 2.7+的本机库,并且同样适用于python3。

如果愿意,可以在这里领取。如果您需要大量使用它,将其托管在http上,也可以轻松地将其放置在您的环境中,并且可以使用任何可用的默认python解释器在任何平台上运行它,可靠地依靠它工作。

它默认为在stderr上使用带有提示的getpass提示(允许轻松捕获stdout),但是如果您将字符串传递给它,它将仅从stdin中获得。根据您的操作方式,它也可能不会出现在命令历史记录中,因此只需了解您正在使用的内容即可。我喜欢拥有一种能够以预期方式运行的灵活工具,而不必依靠软件包或python来完成10种不同方式的胜利。


是否已安装任何版本的python取决于系统。到底是什么问题chpasswd
RalfFriedl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.