Comment créer un mot de passe haché SHA-512 pour shadow?

62

Les questions précédentes de SF que j'ai vues ont conduit à des réponses qui produisent un mot de passe haché MD5.

Quelqu'un a-t-il déjà suggéré de créer un mot de passe haché SHA-512? Je préférerais une ligne au lieu d'un script, mais si un script est la seule solution, c'est très bien aussi.

Mise à jour

Remplacer les versions précédentes de py2 par celle-ci:

python3 -c "import crypt;print(crypt.crypt(input('clear-text pw: '), crypt.mksalt(crypt.METHOD_SHA512)))"
Belmin Fernandez
la source
4
SHA et MD5 ne sont pas cryptés. Ils sont des algorithmes de hachage. La différence cruciale est que les données hachées ne sont pas récupérables. Qu'avez-vous besoin de faire?
SmallClanger
Je vous remercie. Modifié la question. man 5 shadowse réfère à lui comme "mot de passe crypté" alors je suis allé avec ce terme.
Belmin Fernandez
2
Toutes mes excuses si c'était un peu sournois. Essayez-vous de générer manuellement des hachages de mots de passe compatibles avec les ombres? Si c'est le cas, jetez un coup d'œil à votre /etc/shadowcontenu. Vous verrez $x$salt$hash. xdésigne l'algorithme utilisé par crypt, avec 6étant typique des linux modernes, qui est sha512 (voir man 3 crypt). L'une ou l'autre des réponses ci-dessous produira le même hash, à condition de lui donner le même sel.
SmallClanger
2
Oh non, pas sarcastique du tout. Vous avez clarifié quelque chose qui me rendait confus alors je suis très reconnaissant, monsieur!
Belmin Fernandez
1
Je vous remercie! C’est le seul logiciel à base de passlib que j’ai réussi à utiliser OS X.
Stig Brautaset

Réponses:

65

Voici un one-liner:

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

Python 3.3+ inclut mksaltdans crypt , ce qui rend beaucoup plus facile (et plus sûr) d’utiliser:

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

Si vous ne fournissez pas un argument crypt.mksalt(il pourrait accepter crypt.METHOD_CRYPT, ...MD5, SHA256et SHA512), il utilisera le plus fort disponible.

L'identifiant du hash (numéro après le premier $) est lié à la méthode utilisée:

  • 1 -> MD5
  • 2a -> Blowfish (pas dans la glibc principale; ajouté dans certaines distributions Linux)
  • 5 -> SHA-256 (depuis la glibc 2.7)
  • 6 -> SHA-512 (depuis la glibc 2.7)

Je vous recommanderais de rechercher ce que sont les sels et commenter et ainsi que le décrivent les différences entre le cryptage et le hachage.

Mise à jour 1: La chaîne produite convient aux scripts shadow et kickstart. Mise à jour 2: Avertissement. Si vous utilisez un Mac, voyez le commentaire sur son utilisation en python sur un Mac où cela ne semble pas fonctionner comme prévu.

davey
la source
5
Remplacez-le random_saltpar un sel aléatoire réel.
Belmin Fernandez le
6
Je ne peux pas obtenir que cela fonctionne à Yosemite. Voici ce que ça crache: $6asQOJRqB1i2- ça ne semble pas assez long pour être correct!
Stig Brautaset
3
Laissez le module python -c 'import crypt; print crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512))'
crypter
2
Par défaut, la glibc utilise seulement 5000 tours, ce qui est assez faible de nos jours. Vous pouvez spécifier le nombre de tours en ajoutant « tours de $ = ### », par exemple: crypt.crypt("test", "$6$rounds=200000$random_salt"). 200000 prend environ 100 ms sur mon ordinateur portable actuel.
jeudi
2
Cela ne devrait pas être utilisé, au moins sur un Mac. Sur un Mac (10.13.5), cela renvoie le même résultat incorrect à chaque fois.
oskarpearson
37

Sur Debian, vous pouvez utiliser mkpasswd pour créer des mots de passe avec différents algorithmes de hachage adaptés à / etc / shadow. Il est inclus dans le paquet whois (selon apt-file)

mkpasswd -m sha-512
mkpasswd -m md5

pour obtenir une liste des types d'algorithmes de hachage disponibles:

mkpasswd -m help 

HTH

mrossi
la source
3
Quel paquet le fournit? Il existe également un mkpasswdprogramme (une partie de l’attente) sous Fedora, mais il est inutile à cet effet.
Cristian Ciupitu
Comme il l'a dit, la version dont mkpasswdil parle est destinée à Debian / Ubuntu. Le commutateur mkpasswdsur Fedora (au moins 14) manque le -mcommutateur.
Slm
3
Curieusement, c’est le paquet whois, héritage de Debian. Voir dpkg -S /usr/bin/mkpasswdje ne pouvais pas y croire moi-même: D
Rbjz
Pour vérifier un mot de passe, si le premier chiffre est 6, utilisez la partie comprise entre le deuxième et le troisième dollar comme sel. Par exemple , pour root:$6$AbCdE$xyz:...vous devez utiliser: mkpasswd -m sha-512 -S AbCdE. Avec le mot de passe correct, vous devriez obtenir le même hash.
Luc
24

Meilleure réponse: 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
la source
1
Solution simple..fonctionné pour moi sur CentOS 6.
Banjer
4
Sur les systèmes dotés de la grub-cryptcommande, c'est le moyen le plus sûr et le plus pratique de le faire. Pas la peine de jouer avec les sels manuellement quand on peut tout gâcher. Le problème est que de plus en plus de systèmes modernes ont GRUB2 et n'incluront donc pas cette commande.
réveillé le
11

Voici un code C court pour générer le mot de passe SHA-512 sur différents systèmes d'exploitation de type Unix.

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

compiler:

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

usage:

passwd-sha512 <password> <salt (16 chars max)>
BoogieBug
la source
Cette question a 3 ans ...
Grincheux
Ce commentaire n'est pas si vieux. Jolie application que vous avez là-bas, ce n'est que c répondre ici 1up même s'il ressemble à l'exemple de la page de manuel :)
Sampo Sarrala
4

La solution Perl one-liner pour générer le mot de passe haché SHA-512:

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

Travaillé sur RHEL 6

Ivan Chau
la source
2

Pourquoi ne pas effectuer la vérification et la modification suivantes sur les machines Centos / RHEL pour vous assurer que tout le hachage du mot de passe pour / etc / shadow est effectué avec sha512. Ensuite, vous pouvez simplement définir votre mot de passe normalement avec la commande 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
la source
2

Voici un one-liner qui utilise des commandes shell pour créer un mot de passe haché SHA-512 avec un sel aléatoire:

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

Remarques

  1. Vous devrez peut-être installer le paquet "whois" (Debian, SuSE, etc.), qui fournit "mkpasswd".
  2. Voir crypt (3) pour plus de détails sur le format des lignes dans "/ etc / shadow".
ajchace
la source
Malheureusement, le whoispaquet de Fedora 18 n'en fournit aucune mkpasswd.
Cristian Ciupitu
1
Dans Arch Linux: / usr / bin / mkpasswd appartient à expect 5.45-3
Nowaker
Même chose sur Fedora 20 et ça fait autre chose.
Cristian Ciupitu
2
Malheureusement, la commande suggérée a deux problèmes: 1) Le mot de passe fourni est maintenant stocké dans l'historique de votre shell et est visible par toute personne disposant de la commande 'history' ou similaire. 2) Vous n'avez pas besoin de fournir le sel aléatoire sur la ligne de commande - et je pense que vous devriez laisser mkpasswd le faire pour vous au lieu d'utiliser des astuces funky openssl. (Notez que ceci est vrai au moins sur Ubuntu Quantal. Vous pouvez le tester en exécutant plusieurs fois 'mkpasswd -m sha-512 foo'. Vous verrez les modifications apportées au sel. Le sel est la valeur entre le 2ème et le 3ème $. )
oskarpearson
2

Lisez le commentaire ci-dessous pour en savoir plus sur les implications de cette réponse pour la sécurité.

Pour ceux de la mentalité Ruby, voici un one-liner:

'password'.crypt('$6$' + rand(36 ** 8).to_s(36))
TrueDuality
la source
1
Ceci est inexact: la fonction rand de Ruby n’est pas sécurisée - elle utilise un PRNG. Cela générera donc des résultats qui peuvent être inversés en fonction du temps / de l’état du moment où vous avez exécuté cette tâche.
oskarpearson
1

Ce script a fonctionné pour moi sur 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

Il présente les caractéristiques suivantes, qui font défaut à d’autres alternatives:

  • Il génère son sel en toute sécurité. Personne ne devrait compter sur le faire manuellement. Déjà.
  • il ne stocke rien dans l'historique du shell.
  • pour plus de clarté, il affiche le mot de passe de l'utilisateur généré, ce qui peut s'avérer utile pour générer les mots de passe de nombreux utilisateurs.
Ztyx
la source
2
Notez que cela ne fonctionnera que si vous avez chpasswdsur votre système.
Matt Sanders
Pour votre information: chpasswd ne supporte pas -S in shadow-utils-4.1.5.1
Saustrup
0

Les algues HASH servent à produire des résumés MESSAGE, ils ne conviennent jamais aux mots de passe, qui devraient utiliser une sorte de HKDF ( http://tools.ietf.org/rfc/rfc5869.txt ) - voir PBKDF2 ou BCrypt

chris
la source
Bon point, mais man cryptme dit que PBKDF2 n'est pas supporté.
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

Vous pouvez le cloner depuis mon dépôt Github si vous le souhaitez: https://github.com/antoncohen/mksha

Anton Cohen
la source
0

Ce n'est pas un one-liner, mais cela pourrait aider quelqu'un:

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
la source
randomn'est pas cryptographiquement sécurisé, os.urandomdoit être utilisé. 8 caractères d'un dictionnaire de 56 caractères, c'est trop peu. Concaténer une piqûre encore et encore en python est une mauvaise forme aussi (il a une complexité de 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

Évidemment, vous saisissez simplement le deuxième champ et pouvez supprimer le fichier une fois que vous l'avez ajouté à shadow ou pour l'utiliser avec sudo (toujours très probablement shadow).

Joshua Gies
la source
0

Jetez un coup d’oeil à la page de manuel de crypt (3) et je pense que vous constaterez que l’outil de cryptage a été mis à jour pour utiliser glibc et sha256 (5 $) et sha512 (6 $), plusieurs tours, un sel beaucoup plus gros, etc. .

Clairement, SHA512 est pertinent pour le fonctionnement de / etc / shadow.

Cela dit, cette page Web a été très utile - en particulier le MKPASSWD, car cela a résolu MON problème.

Avec un mot de passe potentiellement "perdu", je peux utiliser MKPASSWD et le sel pour générer le hachage SHA512 et confirmer / refuser une liste de mots de passe candidats.

Je voudrais utiliser John the ripper - mais au moins sur mon matériel (Raspberry Pi) et mon budget (rien) - John ne peut pas le faire (il ne semble pas prendre en charge les fonctions avancées de crypt / glibc de la version gratuite de Raspbian.

Remarquez que, puisque j'ai assez de permission pour lire / écrire / etc / shadow, je pourrais simplement écraser le hash et poursuivre la vie ... c'est un exercice académique.


NOTES Notes Glibc La version glibc2 de cette fonction supporte des algorithmes de cryptage supplémentaires.

   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
la source
0

Si vous avez besoin d'une alternative aux one-liners écrits en perl / python, mkpasswd est une bonne correspondance. Bien qu'il soit inclus dans le paquet Whois Debian, il manque sur les systèmes CentOS / RHEL. J'ai modifié la version Debian de mkpasswd et inclus un mécanisme de génération de sel plus fort basé sur OpenSSL. Le binaire résultant conserve intégralement tous les paramètres de ligne de commande de la version Debian. Le code est disponible sur github et devrait être compilé sous n’importe quelle version de Linux: mkpasswd

Liviu
la source
-4

Je ne suis pas sûr de savoir comment SHA-512 est lié /etc/shadow. Ces mots de passe sont cryptédités.

Mais si vous voulez un mot de passe haché avec SHA-512, vous pouvez le faire en echo -n the_password | sha512sum. Vous ne pouvez pas utiliser la sortie pour / etc / shadow.

mailq
la source
2
echo -n the_passworddonc vous n'êtes pas en train de hacher la nouvelle ligne. </ pedant>
SmallClanger
Les mots de passe dans shadowne sont plus cryptés () depuis des années. Les systèmes modernes utilisent au moins md5.
Alexander Janssen
6
En réalité, les mots de passe shadowsont toujours crypt()édités, mais la fonction a été mise à jour pour prendre en charge plusieurs algorithmes différents. Quoi qu'il en soit, la méthode décrite dans cette réponse ne produit pas de hachage approprié /etc/shadow. L'algorithme est plus complexe qu'un seul tour de hachage SHA-512.
Snap