/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
接受md5
,sha-256
和sha-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
#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历史记录中),要么需要安装其他实用程序(python3
,makepasswd
),使用硬编码盐或使用旧的哈希值技术。此方法将在提示输入密码后生成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 楼
在我的情况下,openssl
和chpasswd -e
对在RHEL6中不起作用。结合使用openssl passwd
和usermod -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
评论
使用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