Como criar hashes de senha SHA512 na linha de comando


83

No Linux, posso criar um hash de senha SHA1 usando sha1pass mypassword. Existe uma ferramenta de linha de comando semelhante que me permita criar sha512hashes? A mesma pergunta para Bcrypte PBKDF2.


Você não quer dizer sha1sum?

1
@ Tichodroma não, existe realmente um sha1passcomando, parte do pacote syslinux-common no Debian.
Derobert 17/10/12

2
Existe um sha512sumcomando que faz parte do coreutils e da mesma forma openssl sha512- mas também não o material extra que sha1passfaz.
Keith Thompson

Respostas:


55

Sim, você está procurando mkpasswd, o qual (pelo menos no Debian) faz parte do whoispacote. Não pergunte por que ...

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

Infelizmente, minha versão pelo menos não faz bcrypt. Se a sua biblioteca C o fizer, deve (e a página de manual fornece a opção -R para definir a força). -R também funciona no sha-512, mas não tenho certeza se é PBKDF-2 ou não.

Se você precisar gerar senhas bcrypt, poderá fazê-lo de maneira bastante simples com o Crypt::Eksblowfish::Bcryptmódulo Perl.


70

Em qualquer uma das distros da Red Hat, como Fedora, CentOS ou RHEL, o comando mkpasswdnão inclui o mesmo conjunto de opções da versão normalmente incluída no Debian / Ubuntu.

NOTA: O comando mkpasswdé realmente parte do expectpacote e provavelmente deve ser evitado. Você pode descobrir a qual pacote ele pertence com um desses comandos.

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

Exemplo

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

Ambos os métodos são superiores ao uso, rpmpois os pacotes não precisam ser instalados para serem localizados */mkpasswd.

Soluções alternativas

Para contornar isso, você pode usar os seguintes linux de Python ou Perl para gerar senhas SHA-512. Observe que estes são salgados:

Python (> = 3.3)

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

- ou com script -

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

Python (2.x ou 3.x)

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

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

Nota: $ 6 $ designa sha512. O suporte para esse método de especificação do algoritmo depende do suporte na função da biblioteca crypt (3) no nível do SO (geralmente na libcrypt). Não depende da versão python.

Perl

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

Nestes exemplos, a senha é a string "password" e o salt é "saltsalt". Ambos os exemplos estão usando $ 6 $, o que indica que você deseja que a criptografia use o SHA-512.


2
Para o one-liner python, você pode usar crypt.mksalt(crypt.METHOD_SHA512)para gerar o sal em vez de usar um fixo.
Jake Cobb

2
@JakeCobb crypt.mksaltsó está disponível em Python 3.x
Riccardo Murri

2
Antes de digitar uma senha de texto não criptografado na linha de comando, verifique se o "ignorespace" está definido no HISTCONTROL (por exemplo, faça isso primeiro no CentOS / RHEL: echo 'export HISTCONTROL = "ignoredups: ignorespace"'> /etc/profile.d /histcontrol.sh && source /etc/profile.d/histcontrol.sh). Caso contrário, ele será salvo em sua ~ / .bash_history.
Patrick

3
o perl (e presumivelmente o python) usa a função do sistema "crypt". Portanto, eles não são portáteis, exigem uma função de criptografia que entenda o tipo de hash solicitado. A criptografia OSX não - apenas me devolve uma string criptografada em DES do estilo antigo.
Dan Pritts

1
@RiccardoMurri Eu tenho o Python 2.7.5 e tenho acesso crypt.mksaltno CentOS 7.1 #
user12345

15

Você pode usar o doveadmutilitário, incluído no dovecotpacote.

doveadm pw -s SHA512-CRYPT

Exemplo de resultado:

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

Basta cortar {SHA512-CRYPT} e você obterá sua string de hash SHA512.


Não funciona para mim como um usuário comum: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)
jotik 11/03

12

Execute este comando:

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

em seguida, digite a palavra que você deseja hash.


-bash: / sbin / grub-crypt: Nenhum tal lima ou diretório
Will Sheppard

Eu não acredito que o grub esteja no c7, então você pode usar: python -c 'import crypt, getpass; impressão (crypt.crypt (getpass.getpass (), crypt.mksalt (crypt.METHOD_SHA512)))'
ucemike

3

Para expandir as soluções alternativas do @ slm acima, se você estiver preocupado com alguém que conhece o histórico do bash e vê a senha em texto sem formatação, pode inserir raw_input()na instrução python onde os campos salt e password vão para que seja solicitado. O texto não é mascarado enquanto você digita, mas não aparece no seu histórico do bash. Você também pode iniciar o comando com um espaço à esquerda, mas eu sempre esqueço de fazer isso.

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

2
Você também pode configurar bashpara não gravar comandos prefixados com um espaço adicionado HISTCONTROL=ignorespaceao seu .bashrcarquivo. Quando você executa um comando que deseja excluir do seu histórico, basta digitar um espaço e o comando real.
theillien

1

sha512 htpasswd

Comando que solicita usuário e senha e gera um arquivo htpasswd regular:

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

Funciona com todas as versões python> 2.5.


1

O OpenSSL tem

openssl passwd -6

A ajuda diz:

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

0

Se você estiver usando o método Python (> = 2.7) da resposta do sim e quiser confirmar sua senha antes de gerar - porque você usa senhas grossas ...

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

Na versão desta resposta de 29 de novembro de 2017, ele diz que isso funciona para o python 2.7 (ou posterior). O módulo de criptografia do python2.7 não possui mksalt (). Também acho que você deseja que a chamada crypt.mksalt () seja o segundo argumento para crypt.crypt () (parênteses próximos extraviados?).
315 Juan Juan

0

A versão openssl "OpenSSL 1.1.1” no Linux e a versão openssl "LibreSSL 2.6.5” no MacOS suportam md5_crypt.

Basta executar e digitar a senha:

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

ou forneça a senha de texto sem formatação diretamente à CLI:

openssl password -crypt <plain_text_password_goes_here>
<results_into_a_md5_crypt_password>

-12

Você pode usar sha512sum:

echo "password" | sha512sum

24
Esta resposta está incorreta. O comando não gerará um hash de senha SHA-512 válido . Ele simplesmente calculará a soma de verificação da senha da string \ n (observe que também há uma nova linha no final). Os hashes de senha do Unix são salgados e incluem um código de versão de hash entre dois símbolos "$". Veja a resposta de @slm.
Zorlem

Mais especificamente, o problema é que, embora a senha seja um pouco ofuscada, esse método é vulnerável a um ataque en.wikipedia.org/wiki/Rainbow_table .
DepressedDaniel
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.