如何为阴影创建SHA-512哈希密码?


62

我之前看到的SF问题导致了产生MD5哈希密码的答案。

有没有人建议生成SHA-512哈希密码?我希望使用一个衬纸而不是脚本,但是,如果脚本是唯一的解决方案,那也很好。

更新资料

用这个替换以前的py2版本:

python3 -c "import crypt;print(crypt.crypt(input('clear-text pw: '), crypt.mksalt(crypt.METHOD_SHA512)))"

4
SHA和MD5 加密。他们是哈希算法。关键区别在于散列数据不可恢复。你需要做什么?
SmallClanger

谢谢。修改了问题。man 5 shadow称其为“加密密码”,因此我也赞成该术语。
Belmin Fernandez

2
道歉,如果这有点狡猾。您是否要手动生成与影子兼容的密码哈希?如果是这样,请查看您的/etc/shadow内容。你会看到的$x$salt$hashx表示所使用的算法crypt6在现代linux上很典型,为sha512(请参阅参考资料man 3 crypt)。只要您给它相同的盐,以下任何一个答案都将产生相同的哈希值。
SmallClanger

2
哦,不,一点也不狡猾。您澄清了一些令我困惑的事情,所以我非常感谢先生!
Belmin Fernandez

1
谢谢!基于passlib,一个是唯一一个我已经能够使在OS X上工作
斯蒂格Brautaset

Answers:


65

这是一个班轮:

python -c 'import crypt; print crypt.crypt("test", "$6$random_salt")'

python 3.3+包含mksalt在crypt中,这使得使用起来更容易(更安全):

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

如果你不提供一个参数crypt.mksalt(它可以接受crypt.METHOD_CRYPT...MD5SHA256,和SHA512),它会使用最强可用。

哈希的ID(第一个之后的数字$)与所使用的方法有关:

  • 1-> MD5
  • 2a-> Blowfish(不在主线glibc中;在某些Linux发行版中添加)
  • 5-> SHA-256(自glibc 2.7起)
  • 6-> SHA-512(自glibc 2.7起)

我建议您查一下盐是什么,并且像小流氓评论加密和散列之间的区别。

更新1:生成的字符串适用于shadow和kickstart脚本。更新2:警告。如果您使用的是Mac,请参阅有关在Mac上似乎无法正常工作的python中使用此功能的注释。


5
random_salt实际的随机盐代替。
Belmin Fernandez 2014年

6
我无法在优胜美地工作。这是它吐出来的内容:$6asQOJRqB1i2-似乎还不够长,无法正确!
Stig Brautaset

3
让crypt模块为您加盐: python -c 'import crypt; print crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512))'
rrauenza

2
默认情况下,glibc仅使用5000轮,这几天的表现相当弱。您可以通过添加“ $ rounds = ###”来指定轮数,例如:crypt.crypt("test", "$6$rounds=200000$random_salt")。我目前的笔记本电脑上200000耗时100ms。
srparish

2
至少在Mac上不应使用此功能。在Mac(10.13.5)上,每次都会返回相同的错误结果。
oskarpearson '18年

37

在Debian上,您可以使用mkpasswd使用 适用于/ etc / shadow的不同哈希算法创建密码。它包含在whois软件包中(根据apt-file)

mkpasswd -m sha-512
mkpasswd -m md5

获取可用的哈希算法列表:

mkpasswd -m help 

HTH


3
什么包装提供了它?mkpasswd在Fedora下也有一个程序(期望的一部分),但是对于这个目的它是没有用的。
Cristian Ciupitu

正如他所说,mkpasswd他所谈论的版本是针对Debian / Ubuntu的。的mkpasswd在Fedora(至少达到14)缺少-m开关。
slm

3
奇怪的是,这是Debian遗留下来的whois软件包。看到dpkg -S /usr/bin/mkpasswd我自己不敢相信:D
Rbjz 2014年

要检查密码,如果第一个数字为6,请使用第二个和第三个美元之间的部分作为盐。例如,root:$6$AbCdE$xyz:...您应该使用:mkpasswd -m sha-512 -S AbCdE。使用正确的密码,您应该获得相同的哈希值。
卢克

24

最佳答案:grub-crypt

Usage: grub-crypt [OPTION]...
Encrypt a password.

-h, --helpPrint this message and exit
-v, --version           Print the version information and exit
--md5                   Use MD5 to encrypt the password
--sha-256               Use SHA-256 to encrypt the password
**--sha-512             Use SHA-512 to encrypt the password (default)**

1
简单solution..worked我在CentOS 6
Banjer

4
在具有grub-crypt命令的系统上,这确实是最简单,最方便的方法。当您将其拧紧时,手动玩盐毫无意义。问题在于,越来越多的现代系统具有GRUB2,因此将不包含此命令。
rsaw

11

这是一个简短的C代码,用于在各种Unix类型的OS上生成SHA-512密码。

文件: passwd-sha512.c

#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  if ( argc < 3 || (int) strlen(argv[2]) > 16 ) {
    printf("usage: %s password salt\n", argv[0]);
    printf("--salt must not larger than 16 characters\n");
    return;
  }

  char salt[21];
  sprintf(salt, "$6$%s$", argv[2]);

  printf("%s\n", crypt((char*) argv[1], (char*) salt));
  return;
}

编译:

/usr/bin/gcc -lcrypt -o passwd-sha512 passwd-sha512.c

用法:

passwd-sha512 <password> <salt (16 chars max)>

这个问题
已有

这个评论还不算老。您到达那里的可爱应用程序,即使看起来像手册页示例,它也只能在其中回答1分:)
Sampo Sarrala

4

Perl一线解决方案可生成SHA-512哈希密码:

perl -le 'print crypt "desiredPassword", "\$6\$customSalt\$"'

在RHEL 6上工作


2

为什么不对Centos / RHEL机器执行以下检查和修改,以确保使用sha512完成/ etc / shadow的所有密码哈希处理。然后,您可以使用passwd命令正常设置密码

#Set stronger password hasing
/usr/sbin/authconfig --test | grep sha512 > /dev/null
if [ $? -ne 0 ]; then
echo "Configuring sha512 password hashing"
sudo /usr/sbin/authconfig --enableshadow --passalgo=sha512 --updateall
fi

2

这是一种使用shell命令创建带有随机盐的SHA-512哈希密码的单行代码:

[root @ host] mkpasswd -m sha-512 MyPAsSwOrD $(openssl rand -base64 16 | tr -d'+ ='| head -c 16)

笔记

  1. 您可能需要安装提供“ mkpasswd”的“ whois”软件包(Debian,SuSE等)。
  2. 有关“ / etc / shadow”中行格式的详细信息,请参见crypt(3)。

不幸的whois是Fedora 18 的软件包没有提供mkpasswd
Cristian Ciupitu

1
在Arch Linux中:/ usr / bin / mkpasswd属于Expect 5.45-3
Nowaker

同样在Fedora 20上,它还有其他作用。
Cristian Ciupitu 2014年

2
不幸的是,建议的命令有两个问题:1)提供的密码现在存储在Shell的历史记录中,并且任何使用“ history”命令或类似命令的人都可以看到。2)您不需要在命令行中提供随机盐-我认为您应该让mkpasswd替您完成操作,而不是使用时髦的openssl技巧。(请注意,至少在Ubuntu Quantal上是正确的。您可以通过多次运行'mkpasswd -m sha-512 foo'进行测试。您会看到盐的变化。salt是第2个和第3个$字符之间的值。 )
oskarpearson 2014年

2

阅读下面的评论以了解此答案的安全隐患

对于Ruby思维定式的人来说,这是一句话:

'password'.crypt('$6$' + rand(36 ** 8).to_s(36))

1
这是不正确的:Ruby的rand函数不安全-它使用PRNG,因此这将生成可以根据您运行该代码的时间/状态的猜测进行逆向工程的结果。
oskarpearson '18年

1

该脚本在Ubuntu 12.04 LTS上对我有用:https : //gist.github.com/JensRantil/ac691a4854a4f6cb4bd9

#!/bin/bash
read -p "Enter username: " username
read -s -p "Enter password: " mypassword
echo
echo -n $username:$mypassword | chpasswd -S -c SHA512

它具有以下某些其他替代品所缺少的功能:

  • 它安全地产生盐。没有人应该依靠手动执行此操作。曾经
  • 它在shell历史记录中不存储任何内容
  • 为了清楚起见,它会打印生成的用户密码,这在生成许多用户的密码时可能会很好。

2
请注意,这仅chpasswd在您的系统上有效。
马特·桑德斯

仅供参考:chpasswd在shadow-utils-4.1.5.1中不支持-S
Saustrup


0
#!/usr/bin/env python

import getpass

from passlib.hash import sha512_crypt

if __name__ == "__main__":
    passwd = getpass.getpass('Password to hash: ')
    hash = sha512_crypt.encrypt(passwd)

    print hash

您可以根据需要从我的github存储库中克隆它:https : //github.com/antoncohen/mksha


0

它不是一个班轮,但它可以帮助某人:

import crypt, getpass, pwd, string, sys, random
randomsalt = ""
password = getpass.getpass()
choices = string.ascii_uppercase + string.digits + string.ascii_lowercase
for _ in range(0,8):
    randomsalt += random.choice(choices)
print crypt.crypt(password, '$6$%s$' % randomsalt)

random不是加密安全的,os.urandom应该使用。56个字符长的词典中的8个字符也太少了。在Python中一遍又一遍地刺痛也是不好的形式(它具有O(n ^ 2)复杂度)
Hubert Kario

0
$ htpasswd -c /tmp/my_hash user1
New password: 
Re-type new password: 
Adding password for user user1
$ cat /tmp/my_hash
user1:$apr1$oj1ypcQz$4.6lFVtKz2nr8acsQ8hD30

显然,您只需抓住第二个字段,就可以将文件添加到阴影中或与sudo一起使用(仍然很可能是阴影)后将其删除。


0

看一下crypt(3)的手册页,我想您会发现crypt工具已更新为使用glibc和sha256($ 5)和sha512($ 6),多个回合,更大的盐,等等。 。

显然,SHA512与/ etc / shadow的工作方式有关。

也就是说,此网页非常有帮助-特别是MKPASSWD,因为它可以解决我的问题。

给定一个可能“丢失”的密码,我可以使用MKPASSWD和salt来生成SHA512哈希,并确认/拒绝候选密码列表。

我会使用开膛手约翰-但至少在我的硬件(Raspberry Pi)和预算(什么都没有)上,约翰无法做到(它似乎不支持raspbian免费版中的高级crypt / glibc东西。

请注意,由于我有足够的权限来读取/写入/ etc / shadow,因此我可以覆盖哈希值,然后继续生活……这是一项学术练习。


注意Glibc注意此功能的glibc2版本支持其他加密算法。

   If salt is a  character  string  starting  with  the  characters
   "$id$" followed by a string terminated by "$":

          $id$salt$encrypted

   then instead of using the DES machine, id identifies the encryp‐
   tion method used and this then determines how the  rest  of  the
   password  string is interpreted.  The following values of id are
   supported:

          ID  | Method
          ─────────────────────────────────────────────────────────
          1   | MD5
          2a  | Blowfish (not in mainline glibc; added in some
              | Linux distributions)
          5   | SHA-256 (since glibc 2.7)
          6   | SHA-512 (since glibc 2.7)

   So  $5$salt$encrypted  is  an  SHA-256  encoded   password   and
   $6$salt$encrypted is an SHA-512 encoded one.

0

如果您需要用perl / python编写的单行代码的替代方案,则mkpasswd是一个很好的选择。尽管它已包含在Debian whois软件包中,但在CentOS / RHEL系统上却没有。我已经修改了Debian版本的mkpasswd,并包括了基于OpenSSL的更强大的盐生成机制。生成的二进制文件将完全保留所有Debian的version命令行参数。该代码可在github上找到,并且可以在任何Linux风格上进行编译: mkpasswd


-4

我不确定SHA-512与的关系/etc/shadow。这些密码是crypted。

但是,如果您想使用SHA-512散列密码,可以通过进行echo -n the_password | sha512sum。您不能将输出用于/ etc / shadow。


2
echo -n the_password因此您不会对换行进行哈希处理。</ pedant>
SmallClanger

shadow多年以来,不再对crypt()中的密码进行加密。现代系统至少使用md5。
亚历山大·扬森

6
实际上,shadow仍然输入了密码,crypt()但是功能已更新为支持几种不同的算法。无论如何,此答案中描述的方法不会为生成合适的哈希/etc/shadow。该算法比单个SHA-512哈希回合复杂。
捕捉
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.