Bagaimana cara membuat kata sandi hash SHA-512 untuk bayangan?

62

Pertanyaan SF sebelumnya yang saya lihat mengarah ke jawaban yang menghasilkan kata sandi hash MD5.

Adakah yang punya saran untuk menghasilkan kata sandi hash SHA-512? Saya lebih suka satu liner daripada skrip tetapi, jika skrip adalah satu-satunya solusi, itu bagus juga.

Memperbarui

Mengganti versi py2 sebelumnya dengan yang ini:

python3 -c "import crypt;print(crypt.crypt(input('clear-text pw: '), crypt.mksalt(crypt.METHOD_SHA512)))"
Belmin Fernandez
sumber
4
SHA dan MD5 bukan enkripsi. Mereka adalah algoritma hashing. Perbedaan penting adalah bahwa data hash tidak dapat dipulihkan. Apa yang perlu kamu lakukan?
SmallClanger
Terima kasih. Mengubah pertanyaan. man 5 shadowmenyebutnya sebagai "kata sandi terenkripsi" jadi saya setuju dengan istilah itu.
Belmin Fernandez
2
Maaf jika itu agak snarky. Apakah Anda mencoba membuat hash kata sandi yang kompatibel dengan bayangan secara manual? Jika demikian, lihat /etc/shadowkonten Anda . Kamu akan lihat $x$salt$hash. xmenunjukkan algoritma yang digunakan oleh crypt, dengan 6tipikal pada linux modern, yaitu sha512 (lihat man 3 crypt). Salah satu dari jawaban di bawah ini akan menghasilkan hash yang sama, asalkan Anda memberikan garam yang sama.
SmallClanger
2
Oh, tidak, tidak aneh sama sekali. Anda mengklarifikasi sesuatu yang saya bingung jadi saya sangat berterima kasih pak!
Belmin Fernandez
1
Terima kasih! Yang berbasis passlib adalah satu-satunya yang saya dapat membuat bekerja pada OS X.
Stig Brautaset

Jawaban:

65

Inilah satu kalimat:

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

Python 3.3+ termasuk mksaltdalam crypt , yang membuatnya lebih mudah (dan lebih aman) untuk digunakan:

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

Jika Anda tidak memberikan argumen untuk crypt.mksalt(bisa menerima crypt.METHOD_CRYPT, ...MD5, SHA256, dan SHA512), ia akan menggunakan tersedia terkuat.

ID hash (angka setelah yang pertama $) terkait dengan metode yang digunakan:

  • 1 -> MD5
  • 2a -> Blowfish (bukan di mainline glibc; ditambahkan di beberapa distribusi Linux)
  • 5 -> SHA-256 (sejak glibc 2.7)
  • 6 -> SHA-512 (sejak glibc 2.7)

Saya akan merekomendasikan Anda mencari apa itu garam dan semacamnya dan sebagai perberi kecil berkomentar perbedaan antara enkripsi dan hashing.

Pembaruan 1: String yang dihasilkan cocok untuk skrip shadow dan kickstart. Pembaruan 2: Peringatan. Jika Anda menggunakan Mac, lihat komentar tentang menggunakan ini dalam python di mac yang sepertinya tidak berfungsi seperti yang diharapkan.

davey
sumber
5
Ganti random_saltdengan garam acak yang sebenarnya.
Belmin Fernandez
6
Saya tidak bisa mengaktifkan ini di Yosemite. Inilah yang diceritakan: $6asQOJRqB1i2- yang sepertinya tidak cukup lama untuk menjadi benar!
Stig Brautaset
3
Biarkan modul crypt membuat garam untuk Anda: python -c 'import crypt; print crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512))'
rrauenza
2
glibc secara default hanya menggunakan 5000 ronde yang cukup lemah akhir-akhir ini. Anda dapat menentukan jumlah putaran dengan menambahkan "$ putaran = ###", misalnya: crypt.crypt("test", "$6$rounds=200000$random_salt"). 200000 membutuhkan sekitar 100 ms pada laptop saya saat ini.
srparish
2
Ini tidak boleh digunakan, setidaknya di Mac. Pada Mac (10.13.5) ini mengembalikan hasil yang salah yang sama setiap kali.
oskarpearson
37

Di Debian Anda dapat menggunakan mkpasswd untuk membuat kata sandi dengan algoritma hashing berbeda yang cocok untuk / etc / shadow. Itu sudah termasuk dalam paket whois (sesuai dengan apt-file)

mkpasswd -m sha-512
mkpasswd -m md5

untuk mendapatkan daftar tipe algoritme hashing yang tersedia:

mkpasswd -m help 

HTH

mrossi
sumber
3
Paket apa yang menyediakannya? Ada mkpasswdprogram (bagian dari harapan) di bawah Fedora juga, tetapi tidak ada gunanya untuk tujuan ini.
Cristian Ciupitu
Seperti yang dia katakan, versi yang mkpasswddia bicarakan adalah untuk Debian / Ubuntu. Pada mkpasswdFedora (setidaknya hingga 14) hilang -msaklar.
slm
3
Anehnya, itu adalah paket whois, warisan dari Debian. Lihat, dpkg -S /usr/bin/mkpasswdsaya sendiri tidak bisa percaya: D
Rbjz
Untuk memeriksa kata sandi, jika angka pertama adalah 6, gunakan bagian antara dolar kedua dan ketiga sebagai garam. Misalnya untuk root:$6$AbCdE$xyz:...Anda harus menggunakan: mkpasswd -m sha-512 -S AbCdE. Dengan kata sandi yang benar, Anda harus mendapatkan hash yang sama.
Luc
24

Jawaban Terbaik: 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
sumber
1
Solusi sederhana..bekerja untuk saya di CentOS 6.
Banjer
4
Pada sistem yang memiliki grub-cryptperintah, ini benar-benar cara yang paling mudah & nyaman untuk melakukannya. Tidak masuk akal bermain-main dengan garam secara manual ketika Anda bisa mengacaukannya. Masalahnya adalah semakin banyak sistem modern yang memiliki GRUB2 dan karenanya tidak akan menyertakan perintah ini.
rsaw
11

Berikut adalah kode C pendek untuk menghasilkan kata sandi SHA-512 pada berbagai OS tipe Unix.

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

untuk mengkompilasi:

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

pemakaian:

passwd-sha512 <password> <salt (16 chars max)>
BoogieBug
sumber
Pertanyaan ini berusia 3 tahun ...
Grumpy
Komentar ini belum setua itu. Aplikasi lucu yang Anda dapatkan di sana, itu hanya c menjawab di sana 1up bahkan ketika itu tampak seperti contoh halaman manual :)
Sampo Sarrala
4

Solusi Perl one-liner untuk menghasilkan kata sandi hash SHA-512:

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

Bekerja di RHEL 6

Ivan Chau
sumber
2

Mengapa tidak melakukan pemeriksaan dan modifikasi berikut untuk mesin Centos / RHEL untuk memastikan bahwa semua hashing kata sandi untuk / etc / shadow dilakukan dengan sha512. Kemudian Anda bisa mengatur passworkd Anda secara normal dengan perintah 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
sumber
2

Berikut ini adalah satu-liner yang menggunakan perintah shell untuk membuat kata sandi hash SHA-512 dengan garam acak:

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

Catatan

  1. Anda mungkin perlu menginstal paket "whois" (Debian, SuSE, dll.), Yang menyediakan "mkpasswd".
  2. Lihat crypt (3) untuk detail tentang format baris di "/ etc / shadow".
ajchace
sumber
Sayangnya whoispaket dari Fedora 18 tidak menyediakan apa-apa mkpasswd.
Cristian Ciupitu
1
Di Arch Linux: / usr / bin / mkpasswd dimiliki oleh expect 5.45-3
Nowaker
Sama pada Fedora 20 dan melakukan hal lain.
Cristian Ciupitu
2
Sayangnya perintah yang disarankan memiliki dua masalah: 1) Kata sandi yang diberikan sekarang disimpan dalam riwayat shell Anda, dan dapat dilihat oleh siapa saja dengan perintah 'history' atau serupa. 2) Anda tidak perlu menyediakan garam acak pada baris perintah - dan saya pikir Anda harus membiarkan mkpasswd melakukannya untuk Anda alih-alih menggunakan trik openssl yang funky. (Perhatikan bahwa ini benar setidaknya di Ubuntu Quantal. Anda dapat mengujinya dengan menjalankan 'mkpasswd -m sha-512 foo' beberapa kali. Anda akan melihat perubahan garam. Garam adalah nilai antara karakter $ 2 dan ke-3. )
oskarpearson
2

Baca komentar di bawah untuk mempelajari implikasi keamanan dari jawaban ini

Bagi mereka yang memiliki pola pikir Ruby di sini adalah one-liner:

'password'.crypt('$6$' + rand(36 ** 8).to_s(36))
TrueDuality
sumber
1
Ini tidak benar: Fungsi rand Ruby tidak aman - menggunakan PRNG, jadi ini akan menghasilkan hasil yang dapat direkayasa ulang berdasarkan perkiraan waktu / keadaan saat Anda menjalankan ini.
oskarpearson
1

Skrip ini berfungsi untuk saya di 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

Ini memiliki fitur berikut yang tidak dimiliki oleh beberapa alternatif lain:

  • Ini menghasilkan garamnya dengan aman. Tidak seorang pun harus mengandalkan melakukan ini secara manual. Pernah.
  • itu tidak menyimpan apa pun dalam riwayat shell.
  • untuk kejelasan, ini mencetak kata sandi pengguna mana yang dihasilkannya yang bagus ketika menghasilkan kata sandi banyak pengguna.
Ztyx
sumber
2
Catatan ini hanya akan berfungsi jika Anda memiliki chpasswddi sistem Anda.
Matt Sanders
FYI: chpasswd tidak mendukung -S di shadow-utils-4.1.5.1
Saustrup
0

HASH algos adalah untuk memproduksi intisari PESAN, mereka tidak pernah cocok untuk kata sandi, yang harus menggunakan semacam HKDF ( http://tools.ietf.org/rfc/rfc5869.txt ) - lihat PBKDF2 atau BCrypt

chris
sumber
Poin bagus, tapi man cryptberi tahu saya PBKDF2 tidak didukung.
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

Anda dapat mengkloningnya dari repo github saya jika Anda mau: https://github.com/antoncohen/mksha

Anton Cohen
sumber
0

Ini bukan liner satu, tetapi mungkin membantu seseorang:

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
sumber
randomtidak aman secara kriptografis, os.urandomharus digunakan. 8 karakter dari 56 karakter kamus panjang juga terlalu sedikit. Mengonsentrasikan sengatan berulang-ulang dengan python adalah bentuk buruk juga (ia memiliki kompleksitas 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

Jelas, Anda hanya mengambil bidang ke-2, dan dapat menghapus file setelah Anda menambahkannya ke bayangan atau untuk digunakan dengan sudo (masih kemungkinan besar bayangan).

Joshua Gies
sumber
0

Lihatlah halaman manual untuk crypt (3) dan saya pikir Anda akan menemukan bahwa alat crypt telah diperbarui untuk menggunakan glibc dan sha256 ($ 5) dan sha512 ($ 6), beberapa putaran, garam lebih besar, dan sebagainya .

Jelas SHA512 relevan dengan cara / etc / shadow bekerja.

Yang mengatakan, halaman web ini sangat membantu - khususnya MKPASSWD, karena ini memecahkan masalah SAYA.

Mengingat kemungkinan kata sandi "hilang", saya dapat menggunakan MKPASSWD dan garam, untuk menghasilkan hash SHA512, dan mengonfirmasi / menolak daftar kata sandi kandidat.

Saya akan menggunakan John the ripper - tetapi setidaknya pada perangkat keras saya (Raspberry Pi) dan anggaran saya (tidak ada) - John tidak dapat melakukannya (sepertinya tidak mendukung hal-hal crypt / glibc yang canggih dalam versi gratis raspbian.

Pikiran Anda, karena saya memiliki cukup izin untuk membaca / menulis / etc / shadow, saya BISA hanya menimpa hash, dan melanjutkan hidup ... ini adalah latihan akademis.


CATATAN Glibc notes Versi glibc2 dari fungsi ini mendukung algoritma enkripsi tambahan.

   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
sumber
0

Jika Anda membutuhkan alternatif untuk one-liner yang ditulis dengan perl / python, mkpasswd adalah pasangan yang baik. Meskipun termasuk dalam paket whois Debian, itu tidak ada pada sistem CentOS / RHEL. Saya telah memodifikasi versi Debian dari mkpasswd dan menyertakan mekanisme pembuatan garam yang lebih kuat berdasarkan OpenSSL. Biner yang dihasilkan sepenuhnya mempertahankan semua parameter baris perintah versi Debian. Kode ini tersedia pada github dan harus dikompilasi pada setiap rasa Linux: mkpasswd

Liviu
sumber
-4

Saya tidak yakin bagaimana kaitannya dengan SHA-512 /etc/shadow. Kata sandi ini crypted.

Tetapi jika Anda ingin kata sandi di-hash dengan SHA-512, Anda dapat melakukannya dengan echo -n the_password | sha512sum. Anda tidak dapat menggunakan output untuk / etc / shadow.

surat
sumber
2
echo -n the_passwordjadi Anda tidak hashing baris baru. </pedant>
SmallClanger
Kata sandi dalam shadowtidak crypt () ed lagi sejak tahun. Sistem modern menggunakan setidaknya md5.
Alexander Janssen
6
Sebenarnya kata sandi dalam shadowmasih crypt()ed tetapi fungsinya telah diperbarui untuk mendukung beberapa algoritma yang berbeda. Apapun, metode yang dijelaskan dalam jawaban ini tidak menghasilkan hash yang cocok untuk /etc/shadow. Algoritma lebih kompleks daripada satu putaran hash SHA-512.
jepret