我之前看到的SF问题导致了产生MD5散列密码的答案。我更希望使用一个衬纸而不是脚本,但是,如果脚本是唯一的解决方案,那也很好。

更新

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

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


评论

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

谢谢。修改了问题。 man 5阴影将其称为“加密密码”,因此我也同意该术语。

道歉,如果这有点狡猾。您是否要手动生成与影子兼容的密码哈希?如果是这样,请查看您的/ etc / shadow内容。您会看到$ x $ salt $ hash。 x表示crypt使用的算法,现代linux上通常使用6,即sha512(请参阅man 3 crypt)。只要您给它相同的盐,以下任何一个答案都会产生相同的哈希值。

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

谢谢!基于passlib的是我唯一能够在OS X上进行工作的。

#1 楼

这是一个衬里:
python -c 'import crypt; print crypt.crypt("test", "$random_salt")'

Python 3.3+在crypt中包含mksalt,这使其使用起来更容易(更安全):
python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'

如果不提供crypt.mksalt的参数(可以接受crypt.METHOD_CRYPT...MD5SHA256SHA512),将使用可用的最强参数。
哈希的ID(第一个$之后的数字)与使用的方法有关:

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

我建议您查找什么是盐类,并根据smallclamgers注释加密和哈希之间的区别。
更新1:生成的字符串适用于阴影脚本和kickstart脚本。
更新2:警告。如果您使用的是Mac,请参阅有关在Mac上似乎无法正常使用的python中使用python的注释。
在macOS上,您不应该使用上述版本,因为Python使用的是系统的crypt()的行为不同,并且使用了不安全的DES加密。您可以使用此平台独立的一个内衬(需要passlib –与pip3 install passlib一起安装):
python3 -c 'import passlib.hash; print(passlib.hash.sha512_crypt.hash("test"))'


评论


用实际的随机盐替换random_salt。

– Belmin Fernandez
14年7月31日在13:44

我无法在优胜美地工作。这就是它喷出的东西:$ 6asQOJRqB1i2-看起来还不够长,无法正确!

– Stig Brautaset
15年7月12日在11:12

让crypt模块为您加盐:python -c'import crypt;打印crypt.crypt(“ test”,crypt.mksalt(crypt.METHOD_SHA512))'

– rrauenza
2015年9月14日17:32



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

–西班牙
16 Sep 14'0:20



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

– oskarpearson
18年8月1日在12:56

#2 楼

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

mkpasswd -m sha-512
mkpasswd -m md5


以获得可用的哈希算法类型列表:

mkpasswd -m help 


HTH

评论


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

–克里斯蒂安·丘皮图
2013年3月2日在2:31

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

–slm
13年5月19日在3:47

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

– Rbjz
14年6月18日在21:23

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

–吕克
16 Dec 9'在13:18

#3 楼

最佳答案:
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)**


评论


简单的解决方案..为我在CentOS 6上工作。

– Banjer
2013年5月1日12:15



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

–rsaw
15年7月3日在18:22



#4 楼

这是一个简短的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, "$%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)>


评论


这个问题已经3岁了...

–脾气暴躁
14年2月13日在10:47

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

– Sampo Sarrala-codidact.org
16-09-29在21:20

#5 楼

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

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

在RHEL 6上工作

#6 楼

为什么不对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


#7 楼

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


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


注意事项


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


评论


不幸的是,Fedora 18中的whois软件包没有提供任何mkpasswd。

–克里斯蒂安·丘皮图
2013年3月2日在2:38



在Arch Linux中:/ usr / bin / mkpasswd由Expect 5.45-3拥有

– Nowowaker
13年11月9日在21:18

同样在Fedora 20上,它还有其他作用。

–克里斯蒂安·丘皮图
14年4月17日在19:23

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

– oskarpearson
2014年6月3日在8:40



#8 楼

阅读以下评论,以了解此答案的安全性

对于Ruby的思维方式,这里是一句话:

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


评论


这是不正确的:Ruby的rand函数不安全-它使用PRNG,因此这将生成可以根据您执行此操作的时间/状态的猜测进行逆向工程的结果。

– oskarpearson
18年8月1日在12:53

#9 楼

该脚本在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历史记录中不存储任何内容。
为了清楚起见,它打印它生成的用户密码,这在生成许多用户的密码时可能是不错的。


评论


请注意,这仅在系统上具有chpasswd时才有效。

–马特·桑德斯(Matt Sanders)
15年12月17日在19:01

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

–芥末酱
18年7月10日在11:32

#10 楼

哈希算法用于产生MESSAGE摘要,它们永远不适合密码,密码应使用某种HKDF(http://tools.ietf.org/rfc/rfc5869.txt)-请参阅PBKDF2或BCrypt

评论


很好,但是man crypt告诉我不支持PBKDF2。

–惠更斯
2015年9月15日上午11:15

#11 楼

#!/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

#12 楼

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

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, '$%s$' % randomsalt)


评论


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

–休伯特·卡里奥(Hubert Kario)
17年11月27日在16:14



#13 楼

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


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

#14 楼

看一下crypt(3)的手册页,我想您会发现crypt工具已更新为使用glibc和sha256($ 5)和sha512($ 6),多轮,更大的盐,等等。显然,SHA512与/ etc / shadow的工作方式有关。

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

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

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

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


注释
Glibc注释
thi的glibc2版本s函数支持其他加密算法。

   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  $salt$encrypted  is  an  SHA-256  encoded   password   and
   $salt$encrypted is an SHA-512 encoded one.


#15 楼

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

#16 楼

令人惊讶的是,没有答案表明带有openssl passwd选项的简单-6命令。也许它在2011年还不可用?
如果您不在乎在命令行上提供密码(将密码保留在命令历史记录中),则可以这样做:
openssl passwd -6 YourPassword

它会生成盐,并输出如下代码:
$/57kpVAA/kuPUtzV$Ugxo0RTL2uXCvU7WH43c1qn0quMy2ve.qiBYJPG75tFgTN8gI5Jp/FYPXFOzIsASqVTqM42kjN2805VYLHKzm1

使用stdin选项,它还可以从STDIN(或文件)中读取密码,因此您不必离开它历史上的落后者:
openssl passwd -6 -stdin


评论


是的,在2018-09年的1.1.1中添加了-6(sha512crypt)和-5(sha256crypt)。

–dave_thompson_085
20年5月21日2:00

#17 楼

我不确定SHA-512与/etc/shadow有何关系。这些密码是crypt ed。

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

评论


echo -n the_password,因此您不会对换行符进行哈希处理。

–SmallClanger
2011年11月11日下午13:14

多年以来,shadow中的密码不再加密。现代系统至少使用md5。

–亚历山大·詹森(Alexander Janssen)
2012年10月3日20:40



实际上,阴影中的密码仍然是crypt(),但是该功能已更新为支持几种不同的算法。无论如何,此答案中描述的方法不会为/ etc / shadow生成合适的哈希。该算法比单个SHA-512哈希回合复杂。

–捕捉
13年5月5日,0:12