如何在命令行上创建SHA512密码哈希


83

在Linux中,我可以使用创建SHA1密码哈希sha1pass mypassword。有没有类似的命令行工具可以让我创建sha512哈希?Bcrypt和的问题相同PBKDF2


不是sha1sum

1
@Tichodroma不,实际上有一个sha1pass命令,是Debian上syslinux-common软件包的一部分。
derobert

2
有一个sha512sum命令是coreutils的一部分,类似地openssl sha512-但是多余的东西也sha1pass没有。
基思·汤普森

Answers:


55

是的,您正在寻找mkpasswd,(至少在Debian上是)该whois软件包的一部分。不要问为什么...

anthony@Zia:~$ mkpasswd -m help
Available methods:
des     standard 56 bit DES-based crypt(3)
md5     MD5
sha-256 SHA-256
sha-512 SHA-512

不幸的是,我的版本至少不加密。如果您的C库支持,则应该这样做(并且联机帮助页提供了-R选项来设置强度)。-R也可以在sha-512上使用,但是我不确定它是否为PBKDF-2。

如果需要生成bcrypt密码,则可以使用Crypt::Eksblowfish::BcryptPerl模块相当简单地完成。


70

在诸如Fedora,CentOS或RHEL之类的任何Red Hat发行版中,该命令mkpasswd都没有包含与Debian / Ubuntu通常包含的版本相同的开关集。

注意:该命令mkpasswd实际上是expect软件包的一部分,应避免使用。您可以使用以下任何一个命令找出它属于哪个软件包。

$ yum whatprovides "*/mkpasswd"
-or-
$ repoquery -q --file */mkpasswd

$ repoquery -q --file */mkpasswd
expect-0:5.43.0-8.el5.x86_64
expect-0:5.43.0-8.el5.i386

这两种方法均优于使用方法,rpm因为不必安装软件包即可定位*/mkpasswd

解决方法

要解决此问题,您可以使用以下Python或Perl单行代码生成SHA-512密码。请注意,这些都是盐腌的:

Python(> = 3.3)

$ python -c 'import crypt,getpass; print(crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA512)))'

-或脚本化-

$ python -c 'import crypt; print(crypt.crypt("somesecret", crypt.mksalt(crypt.METHOD_SHA512)))'

Python(2.x或3.x)

$ python -c "import crypt, getpass, pwd; \
             print(crypt.crypt('password', '\$6\$saltsalt\$'))"

$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

注意:$ 6 $表示sha512。对这种指定算法方法的支持取决于操作系统级别crypt(3)库函数(通常在libcrypt中)的支持。它不依赖于python版本。

佩尔

$ perl -e 'print crypt("password","\$6\$saltsalt\$") . "\n"'
$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

在这些示例中,密码为字符串“ password”,盐为“ saltsalt”。这两个示例都使用$ 6 $,这表示您希望加密使用SHA-512。


2
对于python一线式,您可以crypt.mksalt(crypt.METHOD_SHA512)用来生成盐,而不是使用固定的盐。
杰克·科布

2
@JakeCobb crypt.mksalt仅在Python 3.x中可用
Riccardo Murri

2
在命令行中输入明文密码之前,请确保在HISTCONTROL中设置了“ ignorespace”(即,首先在CentOS / RHEL上执行此操作:echo'export HISTCONTROL =“ ignoredups:ignorespace”'> /etc/profile.d /histcontrol.sh &&源/etc/profile.d/histcontrol.sh)。否则,它将保存在您的〜/ .bash_history中。
Patrick

3
perl(大概是python)使用系统函数“ crypt”。因此它们不是可移植的,它们需要能够理解请求的哈希类型的crypt函数。OSX crypt并没有-它只是给了我一个老式的DES加密字符串。
Dan Pritts '16

1
@RiccardoMurri我有Python 2.7.5,并可以crypt.mksalt在CentOS 7.1上访问
user12345 '16

15

您可以使用包装中doveadm包含的实用dovecot程序。

doveadm pw -s SHA512-CRYPT

结果示例:

{SHA512-CRYPT}$6$0JvQ1LLFESzA16.I$JVdKAIq0igudTq06BMqzT9rL1gRawMPwLr9U3/kBMKUqZdONfa0wubC89C35LKl3aE16CRH57BfGb4ygPLggL1

只需剪切{SHA512-CRYPT},您将获得SHA512哈希字符串。


对我的普通用户doveadm(jotik): Fatal: Error reading configuration: stat(/etc/dovecot/dovecot.conf) failed: Permission denied (euid=1000(jotik) egid=100(users) missing +x perm: /etc/dovecot, we're not in group 97(dovecot), dir owned by 0:97 mode=0750)
不起作用

12

运行以下命令:

$ /sbin/grub-crypt --sha-512

然后输入您要散列的单词。


-bash:/ sbin / grub-crypt:没有这样的文件或目录
Will Sheppard

我不相信grub在c7上,因此您可以使用:python -c'import crypt,getpass; print(crypt.crypt(getpass.getpass(),crypt.mksalt(crypt.METHOD_SHA512)))'
ucemike

3

为了扩展上述@slm的解决方法,如果您担心有人掌握了bash的历史记录并看到纯文本密码,则可以raw_input()在python语句中插入salt和password字段的位置,以便提示您输入密码。键入时不会屏蔽文本,但不会在bash历史记录中显示该文本。您也可以在前导空格处启动命令,但是我总是忘记这样做。

python -c "import crypt, getpass, pwd; print crypt.crypt(raw_input(), '\$6\$' + raw_input() + '\$')"

2
您还可以配置bash为不记录HISTCONTROL=ignorespace.bashrc文件中添加空格的命令。运行命令时,只要从历史记录中排除,只需键入一个空格,然后键入实际命令。
theillien '16

1

sha512 htpasswd

要求用户和密码并生成常规htpasswd文件的命令:

python -c 'import crypt,getpass; print(getpass.getpass("Name: ")+":"+crypt.crypt(getpass.getpass(),crypt.mksalt(crypt.METHOD_SHA512)))' >> htpasswd

适用于所有Python版本> 2.5。


1

OpenSSL有

openssl passwd -6

帮助说:

$ openssl passwd --help
Usage: passwd [options]
Valid options are:
...
 -6                  SHA512-based password algorithm

0

如果您使用sim的答案中的Python(> = 2.7)方法,并希望在生成密码之前先确认密码-因为您输入的密码太宽泛...

$ python -c 'import crypt,getpass;pw=getpass.getpass(); print(crypt.crypt(pw), crypt.mksalt(crypt.METHOD_SHA512) if (pw==getpass.getpass("Confirm: ")) else exit())'

在此答案的2017年11月29日版本中,它说这适用于python 2.7(或更高版本)。python2.7的crypt模块没有mksalt()。我还认为您希望将crypt.mksalt()调用作为crypt.crypt()的第二个参数(放错位置的封闭括号?)。
胡安

0

Linux上的openssl版本“ OpenSSL 1.1.1”和MacOS上的openssl版本“ LibreSSL 2.6.5”都支持md5_crypt。

只需运行并输入密码:

openssl passwd -crypt
Password:
Verifying - Password:
<results_into_a_md5_crypt_password>

或直接向CLI提供纯文本密码:

openssl password -crypt <plain_text_password_goes_here>
<results_into_a_md5_crypt_password>

-12

您可以使用sha512sum

echo "password" | sha512sum

24
这个答案是不正确的。该命令将不会生成有效的SHA-512 密码哈希。它将只计算字符串password \ n的校验和\(请注意,最后还有一个换行符)。Unix密码哈希是固定的,并且在两个“ $”符号之间包含哈希版本代码。请参阅@slm的答案。
zorlem

更具体地说,问题在于,虽然密码有些模糊,但是此方法容易受到en.wikipedia.org/wiki/Rainbow_table攻击。
DepressedDaniel
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.