我需要手动编辑/etc/shadow才能更改虚拟机映像内部的root密码。

是否有一个命令行工具可以接受密码并在标准输出上生成与/etc/shadow兼容的密码哈希?

#1 楼

您可以对以下命令使用相同的命令:
方法1(md5,sha256,sha512)
openssl passwd -6 -salt xyz  yourpass

注意:传递-1将生成MD5密码,-5 SHA256和-6 SHA512(推荐)
方法2(md5,sha256,sha512)
mkpasswd --method=SHA-512 --stdin

选项--method接受md5sha-256sha-512
方法3(des,md5,sha256,sha512)
按照@tink的建议,我们可以使用chpasswd使用以下命令更新密码:
echo "username:password" | chpasswd 

或者您也可以将加密的密码与chpasswd一起使用。首先使用以下命令生成它:
perl -e 'print crypt("YourPasswd", "salt", "sha512"),"\n"'

然后您可以使用生成的密码来更新/etc/shadow
echo "username:encryptedPassWd" | chpasswd -e

我们也可以使用此加密密码来创建新用户密码,例如:
useradd -p 'encryptedPassWd'  username


评论


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

–杂物
14-10-15在19:28

请注意,这些将最终出现在您的shell历史记录中。我将使用openssl passwd -1,其中1)不会结束,2)会为您生成随机盐(这也不会出现在shell历史中)。

– Ztyx
15年9月22日在12:20

openssl passwd文档,适用于试图弄清-1选项功能的任何人。

– CivFan
2015年10月29日在21:55



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

– CivFan
15-10-29在22:47

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

– Ztyx
16年1月11日,9:04

#2 楼

在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


评论


无需指定盐,mkpasswd负责生成随机盐。

– To마SE
16年5月23日在20:03

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

– CMCDragonkai
18年8月8日在5:36

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

–user3183018
18年8月8日在16:11

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

–user3183018
18年3月8日在16:13

#3 楼

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


无需安装其他任何内容
不将密码存储在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.')"



参考文献


如何为/ etc / shadow创建SHA-512哈希密码?
带盐的SHA512


#4 楼

我目前不接受任何当前方法-它们要么在命令行中传递密码(最终出现在我的shell历史记录中),要么需要安装其他实用程序(python3makepasswd),使用硬编码盐或使用旧的哈希值技术。

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

一种使用Python 2且没有任何非标准库的方法:

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


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

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


评论


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

–adam820
18-10-4在17:00

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

– Gert van den Berg
18-10-5在6:10

同样,使用openssl命令,您不必使用硬编码盐,也不必在命令行上通过密码,请尝试例如此变体:openssl passwd -6 -salt $(head -c18 / dev / urandom | openssl base64)

–maxschlepzig
20年5月1日在19:55

@maxschlepzig仅关闭“ -salt”选项似乎也会导致随机添加盐。 mkpasswd还有其他选项,例如也指定回合数。 Python3的crypt.mksalt也允许指定它们。 (我有一个Python 3不可用的用例,这就是为什么存在此答案的原因)

– Gert van den Berg
20年5月3日,12:20

@GertvandenBerg,要点是:答案第一段中的理由不正确。反例openssl:它不需要您在命令行上传递密码,它通常不需要安装其他实用程序(即哪个系统没有预装openssl二进制文件,而是python ..),它不使用硬编码的盐,也不使用旧的哈希技术。

–maxschlepzig
20年5月3日,12:42

#5 楼

对于那些没有基于Debian的系统的人。 Python3也可以正常工作。
python3 -c 'import crypt, getpass; print(crypt.crypt(getpass.getpass()))'

getpass.getpass()会在命令行提示您输入密码。

评论


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

– maulinglawns
17年7月22日在16:32

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

–MichałF
17年9月29日在21:08

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

–格雷格
17年9月29日在21:29

不建议这样做,因为它会将密码保留在您的Shell历史记录中。

–马克·斯托斯伯格
18-3-28的15:00

在此处提供了类似但可能更好的答案:stackoverflow.com/a/52096301/3628951

– AdamKalisz
18年8月30日在11:50

#6 楼

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

生成MD5密码

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


生成DES密码

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


评论


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

–用户
16年5月30日在12:52

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

–用户
16年5月30日在12:52

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

– AdamKalisz
18年8月30日在11:48

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

–马耳他
19-09-22在14:30

#7 楼

在我的情况下,opensslchpasswd -e对在RHEL6中不起作用。结合使用openssl passwdusermod -p命令可以完成这项工作。

生成密码的哈希值和盐值:

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

RPVAd$vgsoSANybLDepv2ETcUH7.


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

$ usermod -p 'RPVAd$vgsoSANybLDepv2ETcUH7.' root


在阴影文件中检出。

$ grep root /etc/shadow

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


#8 楼

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

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

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

评论


是否已安装任何版本的python取决于系统。 chpasswd到底是什么问题?

– RalfFriedl
18年9月3日在21:12

#9 楼

正如许多评论者所指出的那样。指定盐,更不用说密码了,这是一个安全问题,因为这样可以重用盐。盐的重复使用使对您的密码散列的彩虹表攻击更加可行,并且还可以清楚地表明哪些用户彼此共享密码(隔离并突出显示不太安全的密码,例如123456或qwertyuiop)。
您不应该在命令行上指定密码(因为该密码已保存在Shell历史记录中,即使已删除,它仍可以在磁盘的可用空间中保留一段时间,尤其是在使用COW文件系统的情况下)。您根本不应该手动指定盐。您只需使用以下命令即可实现此目的:
openssl passwd -6

-6指定SHA512。对于SHA256使用-5。如果可能,请避免对MD5使用-1。)
OpenSSL会通过stdin两次询问您的密码,并为每个输入生成随机盐。

#10 楼

目前,我没有足够的声誉来发表评论。我创建了此密码生成器工具。它使用Rahul Patil描述的方法1。

评论


我不认为基于Web的工具有资格被视为“命令行工具”,除非您可以说明如何从CLI调用它。

– Jeff Schaller♦
20年7月3日,0:11

它是从命令行调用的。您可以将命令行生成的“ yourpass”与Web工具生成的密码进行比较。

–阿玛德·哈立德(Ammad Khalid)
20年7月3日,0:47

@JeffSchaller imgur.com/a/5MPjlnt

–阿玛德·哈立德(Ammad Khalid)
20年7月3日,0:49

有人会解释是否有任何理由拒绝我的回答?因为我无法发表评论或制作了网络基础工具?谢谢

–阿玛德·哈立德(Ammad Khalid)
20年7月12日在8:55