Como criar uma senha com hash SHA-512 para sombra?

62

As perguntas anteriores sobre SF que levaram a respostas que produzem a senha com hash MD5.

Alguém tem alguma sugestão para produzir uma senha com hash SHA-512? Eu preferiria um liner em vez de um script, mas, se um script é a única solução, tudo bem também.

Atualizar

Substituindo as versões py2 anteriores por esta:

python3 -c "import crypt;print(crypt.crypt(input('clear-text pw: '), crypt.mksalt(crypt.METHOD_SHA512)))"
Belmin Fernandez
fonte
4
SHA e MD5 não são criptografia. Eles estão usando algoritmos de hash. A diferença crucial é que os dados com hash não são recuperáveis. O que você precisa fazer?
SmallClanger 11/11
Obrigado. Modificou a pergunta. man 5 shadowrefere-se a ele como "senha criptografada", então fui com esse termo.
Belmin Fernandez 11/11
2
Desculpas se isso foi um pouco irritante. Você está tentando gerar manualmente hashes de senha compatíveis com sombra? Nesse caso, dê uma olhada no seu /etc/shadowconteúdo. Você verá $x$salt$hash. xdenota o algoritmo usado por crypt, 6sendo típico em linuxes modernos, que é sha512 (consulte man 3 crypt). Qualquer uma das respostas abaixo produzirá o mesmo hash, desde que você dê o mesmo sal.
SmallClanger 11/11
2
Oh não, nem um pouco sarcástico. Você esclareceu algo sobre o qual eu estava confuso, por isso estou muito agradecido, senhor!
Belmin Fernandez 11/11
11
Obrigado! O one-base passlib é o único que eu fui capaz de fazer o trabalho no OS X.
Stig Brautaset

Respostas:

65

Aqui está uma lista:

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

O Python 3.3+ inclui mksaltno crypt , o que torna muito mais fácil (e mais seguro) o uso:

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

Se você não fornecer um argumento para crypt.mksalt(que poderia aceitar crypt.METHOD_CRYPT, ...MD5, SHA256, e SHA512), ele usará o mais forte disponível.

O ID do hash (número após o primeiro $) está relacionado ao método usado:

  • 1 -> MD5
  • 2a -> Blowfish (não no glibc da linha principal; adicionado em algumas distribuições do Linux)
  • 5 -> SHA-256 (desde glibc 2.7)
  • 6 -> SHA-512 (desde glibc 2.7)

Eu recomendo que você pesquise o que são sais e tal e, de acordo com os pequenos comerciantes, comente a diferença entre criptografia e hash.

Atualização 1: a sequência produzida é adequada para scripts shadow e kickstart. Atualização 2: Aviso. Se você estiver usando um Mac, consulte o comentário sobre como usá-lo em python em um Mac, onde ele não parece funcionar conforme o esperado.

davey
fonte
5
Substitua random_saltpor um sal aleatório real.
Belmin Fernandez 31/07/2014
6
Não consigo fazer isso funcionar em Yosemite. Isto é o que ele diz: $6asQOJRqB1i2- que não parece suficientemente longo para estar correto!
Stig Brautaset
3
Deixe o módulo crypt fazer o sal para você: python -c 'import crypt; print crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512))'
rrauenza
2
O glibc, por padrão, usa apenas 5000 rodadas, o que é bastante fraco atualmente. Você pode especificar o número de rodadas, adicionando "$ rodadas = ###", por exemplo: crypt.crypt("test", "$6$rounds=200000$random_salt"). 200000 leva cerca de 100ms no meu laptop atual.
srparish 14/09/16
2
Isso não deve ser usado, pelo menos em um Mac. Em um Mac (10.13.5), isso retorna o mesmo resultado incorreto todas as vezes.
Oskarpearson
37

No Debian, você pode usar o mkpasswd para criar senhas com diferentes algoritmos de hash adequados para o / etc / shadow. Está incluído no pacote whois (de acordo com o arquivo apt)

mkpasswd -m sha-512
mkpasswd -m md5

para obter uma lista dos algoritmos de hash disponíveis, digite:

mkpasswd -m help 

HTH

Mrossi
fonte
3
Que pacote o fornece? Também existe um mkpasswdprograma (parte da expectativa) no Fedora, mas é inútil para esse fim.
Cristian Ciupitu
Como ele disse, a versão de que mkpasswdele está falando é para o Debian / Ubuntu. O mkpasswdno Fedora (pelo menos até 14) está faltando a -mopção.
Slm
3
Curiosamente, é o pacote whois, legado do Debian. Veja, dpkg -S /usr/bin/mkpasswdeu mesmo não conseguia acreditar: D
Rbjz 18/06/2014
Para verificar uma senha, se o primeiro dígito for 6, use a parte entre o segundo e o terceiro dólar como sal. Por exemplo, para root:$6$AbCdE$xyz:...que você deve usar: mkpasswd -m sha-512 -S AbCdE. Com a senha correta, você deve obter o mesmo hash.
9556 Luc Luc
24

Melhor resposta: 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)**
Wayne
fonte
11
Solution..worked simples para me no CentOS 6
Banjer
4
Nos sistemas que têm o grub-cryptcomando, essa é realmente a maneira mais infalível e conveniente de fazer isso. Não faz sentido brincar com sais manualmente quando você pode estragar tudo. O problema é que sistemas cada vez mais modernos têm GRUB2 e, portanto, não incluem este comando.
rsaw
11

Aqui está um código C curto para gerar a senha do SHA-512 em vários sistemas operacionais do tipo Unix.

Arquivo: 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;
}

compilar:

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

uso:

passwd-sha512 <password> <salt (16 chars max)>
BoogieBug
fonte
Esta pergunta tem 3 anos ...
Grumpy
Este comentário não é tão antigo. Aplicativo bonito você chegou lá, isso é apenas c responder lá 1up, mesmo quando parece que exemplo página man :)
Sampo Sarrala
4

Solução de uma linha Perl para gerar a senha com hash SHA-512:

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

Trabalhou no RHEL 6

Ivan Chau
fonte
2

Por que não executar a seguinte verificação e modificação nas máquinas Centos / RHEL para garantir que todo o hash de senha para / etc / shadow seja feito com sha512. Então você pode simplesmente definir seu passworkd normalmente com o comando 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
ckliborn
fonte
2

Aqui está um one-liner que usa comandos shell para criar uma senha com hash SHA-512 com um sal aleatório:

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

Notas

  1. Você pode precisar instalar o pacote "whois" (Debian, SuSE, etc.), que fornece "mkpasswd".
  2. Veja crypt (3) para detalhes sobre o formato das linhas em "/ etc / shadow".
ajchace
fonte
Infelizmente, o whoispacote do Fedora 18 não fornece nenhum mkpasswd.
Cristian Ciupitu
11
No Arch Linux: / usr / bin / mkpasswd é de propriedade de expect 5.45-3
Nowaker
O mesmo no Fedora 20 e faz outra coisa.
Cristian Ciupitu
2
Infelizmente, o comando sugerido tem dois problemas: 1) A senha fornecida agora está armazenada no histórico do seu shell e é visível para qualquer pessoa com o comando 'history' ou similar. 2) Você não precisa fornecer o sal aleatório na linha de comando - e acho que você deve deixar o mkpasswd fazer isso por você, em vez de usar truques do openssl. (Observe que isso é verdade pelo menos no Ubuntu Quantal. Você pode testá-lo executando 'mkpasswd -m sha-512 foo' várias vezes. Você verá as alterações de sal. O sal é o valor entre o segundo e o terceiro caracteres $. )
oskarpearson
2

Leia o comentário abaixo para aprender sobre as implicações de segurança desta resposta

Para aqueles da mentalidade Ruby, aqui está uma das frases:

'password'.crypt('$6$' + rand(36 ** 8).to_s(36))
TrueDuality
fonte
11
Isso está incorreto: a função rand do Ruby não é segura - ela usa um PRNG; portanto, isso gera resultados que podem ser projetados de forma reversa com base na estimativa do tempo / estado do momento em que você executou isso.
Oskarpearson
1

Este script funcionou para mim no 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

Possui os seguintes recursos que algumas das outras alternativas não possuem:

  • Ele gera seu sal com segurança. Ninguém deve confiar em fazer isso manualmente. Sempre.
  • não armazena nada no histórico do shell.
  • para maior clareza, imprime qual senha de usuário gerou, o que pode ser bom ao gerar senhas de muitos usuários.
Ztyx
fonte
2
Observe que isso só funcionará se você tiver chpasswdno seu sistema.
Matt Sanders
FYI: chpasswd não suporta -S na sombra-utils-4.1.5.1
Saustrup
0

Os algos HASH destinam-se à produção de resumos MESSAGE, nunca são adequados para senhas, que devem usar algum tipo de HKDF ( http://tools.ietf.org/rfc/rfc5869.txt ) - consulte PBKDF2 ou BCrypt

chris
fonte
Bom ponto, mas man cryptme diz que PBKDF2 não é suportado.
Huygens
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

Você pode cloná-lo no meu repositório do github, se quiser: https://github.com/antoncohen/mksha

Anton Cohen
fonte
0

Não é um liner, mas pode ajudar alguém:

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)
jordixou
fonte
randomnão é criptograficamente seguro, os.urandomdeve ser usado. 8 caracteres de um dicionário de 56 caracteres também é muito pouco. Concatentating uma picada repetidamente em python é má forma também (ele tem O (n ^ 2) a complexidade)
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

Obviamente, você apenas pega o segundo campo e pode excluir o arquivo depois de adicioná-lo à sombra ou para usá-lo com o sudo (ainda provavelmente sombra).

Joshua Gies
fonte
0

Dê uma olhada na página de manual do crypt (3) e acho que você descobrirá que a ferramenta crypt foi atualizada para usar glibc e sha256 (US $ 5) e sha512 (US $ 6), várias rodadas, sal muito maior e assim por diante .

Claramente, o SHA512 é relevante para o funcionamento do / etc / shadow.

Dito isto, esta página foi muito útil - em particular o MKPASSWD, pois isso resolveu MEU problema.

Dada uma senha potencialmente "perdida", eu posso usar o MKPASSWD e o salt para gerar o hash SHA512 e confirmar / negar uma lista de senhas candidatas.

Eu usaria John, o estripador - mas pelo menos no meu hardware (Raspberry Pi) e no meu orçamento (nada) - John não pode fazer isso (parece não suportar o material avançado de criptografia / glibc na versão gratuita raspbian.

Lembre-se, já que tenho permissão suficiente para ler / escrever / etc / shadow, eu poderia substituir o hash e continuar com a vida ... esse é um exercício acadêmico.


NOTAS Glibc notes A versão glibc2 desta função suporta algoritmos de criptografia adicionais.

   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.
joeomniback
fonte
0

Se você precisar de uma alternativa aos one-liners escritos em perl / python, mkpasswd é uma boa combinação. Embora esteja incluído no pacote whois do Debian, ele está ausente nos sistemas CentOS / RHEL. Modifiquei a versão Debian do mkpasswd e incluí um mecanismo mais forte de geração de sal baseado no OpenSSL. O binário resultante preserva completamente todos os parâmetros de linha de comando da versão do Debian. O código está disponível no github e deve ser compilado em qualquer versão do Linux: mkpasswd

Liviu
fonte
-4

Não tenho certeza de como o SHA-512 está relacionado /etc/shadow. Essas senhas são crypteditadas.

Mas se você quiser um hash de senha com o SHA-512, faça isso echo -n the_password | sha512sum. Você não pode usar a saída para / etc / shadow.

mailq
fonte
2
echo -n the_passwordentão você não está fazendo hash na nova linha. </pedant>
SmallClanger 11/11
As senhas shadownão são mais criptografadas desde anos. Sistemas modernos usam pelo menos MD5.
Alexander Janssen
6
Na verdade, as senhas shadowainda são crypt()editadas, mas a função foi atualizada para oferecer suporte a vários algoritmos diferentes. Independentemente, o método descrito nesta resposta não produz hash adequado /etc/shadow. O algoritmo é mais complexo que uma única rodada de hash SHA-512.
snap