Cara membuat hash kata sandi SHA512 di baris perintah

83

Di Linux saya bisa membuat hash kata sandi SHA1 menggunakan sha1pass mypassword. Apakah ada alat baris perintah serupa yang memungkinkan saya membuat sha512hash? Pertanyaan yang sama untuk Bcryptdan PBKDF2.

siswa
sumber
Bukankah maksud Anda sha1sum?
1
@Tichodroma tidak, sebenarnya ada sha1passperintah, bagian dari paket syslinux-common di Debian.
derobert
2
Ada sha512sumperintah yang merupakan bagian dari coreutils, dan juga openssl sha512- tetapi tidak ada hal-hal tambahan yang sha1passmelakukannya.
Keith Thompson

Jawaban:

55

Ya, Anda sedang mencari mkpasswd, yang (setidaknya di Debian) adalah bagian dari whoispaket. Jangan tanya kenapa ...

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

Sayangnya, versi saya setidaknya tidak melakukan bcrypt. Jika pustaka C Anda melakukannya, itu harus (dan halaman manual memberikan opsi -R untuk mengatur kekuatan). -R juga bekerja pada sha-512, tapi saya tidak yakin apakah ini PBKDF-2 atau tidak.

Jika Anda perlu membuat kata sandi bcrypt, Anda dapat melakukannya dengan cukup sederhana dengan Crypt::Eksblowfish::Bcryptmodul Perl.

derobert
sumber
70

Pada salah satu distro Red Hat seperti Fedora, CentOS, atau RHEL perintah mkpasswdtidak menyertakan set switch yang sama seperti versi yang biasanya disertakan dengan Debian / Ubuntu.

CATATAN: Perintah mkpasswdini sebenarnya bagian dari expectpaket, dan mungkin harus dihindari. Anda dapat mengetahui paket miliknya dengan salah satu dari perintah ini.

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

Contoh

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

Kedua metode ini lebih unggul daripada menggunakan rpmkarena paket tidak harus diinstal untuk mencari */mkpasswd.

Penanganan masalah

Untuk mengatasinya, Anda dapat menggunakan Python atau Perl one-liners berikut untuk menghasilkan kata sandi SHA-512. Perhatikan bahwa ini asin:

Python (> = 3.3)

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

-atau dituliskan-

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

Python (2.x atau 3.x)

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

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

Catatan: $ 6 $ menunjuk sha512. Dukungan untuk metode ini menentukan algoritma tergantung pada dukungan dalam fungsi perpustakaan crypt (3) tingkat OS (biasanya dalam libcrypt). Itu tidak tergantung pada versi python.

Perl

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

Dalam contoh-contoh ini kata sandi adalah string "kata sandi" dan garamnya adalah "saltsalt". Kedua contoh menggunakan $ 6 $ yang menunjukkan bahwa Anda ingin crypt menggunakan SHA-512.

slm
sumber
2
Untuk python one-liner, Anda bisa menggunakan crypt.mksalt(crypt.METHOD_SHA512)untuk menghasilkan garam alih-alih menggunakan yang sudah diperbaiki.
Jake Cobb
2
@JakeCobb crypt.mksalthanya tersedia dalam Python 3.x
Riccardo Murri
2
Sebelum mengetikkan kata sandi teks-jelas pada baris perintah pastikan Anda memiliki "ignorespace" yang diatur dalam HISTCONTROL (yaitu, lakukan ini terlebih dahulu di CentOS / RHEL: echo 'export HISTCONTROL = "ignoredups: ignorespace"'> /etc/profile.d /histcontrol.sh && sumber /etc/profile.d/histcontrol.sh). Kalau tidak, itu akan disimpan di ~ / .bash_history Anda.
Patrick
3
perl (dan mungkin python) menggunakan fungsi sistem "crypt". Jadi mereka tidak portabel, mereka membutuhkan fungsi crypt yang memahami tipe hash yang diminta. Crypt OSX tidak - itu hanya memberi saya kembali string DES-dienkripsi gaya lama.
Dan Pritts
1
@RiccardoMurri Saya memiliki Python 2.7.5 dan memiliki akses ke crypt.mksaltpada CentOS 7.1
user12345
15

Anda dapat menggunakan doveadmutilitas, yang termasuk dalam dovecotpaket.

doveadm pw -s SHA512-CRYPT

Contoh hasil:

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

Cukup potong {SHA512-CRYPT} dan Anda akan mendapatkan string hash SHA512 Anda.

obohovyk
sumber
Tidak berfungsi untuk saya sebagai pengguna biasa: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
12

Jalankan perintah ini:

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

lalu masukkan kata hash yang kamu inginkan.

ucemike
sumber
-bash: / sbin / grub-crypt: Tidak ada file atau direktori seperti itu
Will Sheppard
Saya tidak percaya grub ada di c7 sehingga Anda dapat menggunakan: python -c 'import crypt, getpass; print (crypt.crypt (getpass.getpass (), crypt.mksalt (crypt.METHOD_SHA512))) '
ucemike
3

Untuk memperluas pemecahan masalah @ slm di atas, jika Anda khawatir seseorang mengetahui riwayat bash Anda dan melihat kata sandi teks biasa, Anda bisa memasukkan raw_input()pernyataan python di mana bidang garam dan kata sandi pergi sehingga meminta Anda untuk mendapatkannya. Teks tidak tertutup saat Anda mengetik, tetapi tidak akan muncul di bash history Anda. Anda juga bisa memulai perintah dengan spasi terdepan, tetapi saya selalu lupa melakukannya.

python -c "import crypt, getpass, pwd; print crypt.crypt(raw_input(), '\$6\$' + raw_input() + '\$')"
pengguna208145
sumber
2
Anda juga dapat mengonfigurasi bashuntuk tidak merekam perintah yang diawali dengan spasi yang ditambahkan HISTCONTROL=ignorespaceke .bashrcfile Anda . Saat Anda menjalankan perintah yang ingin Anda kecualikan dari riwayat Anda cukup ketik spasi lalu perintah yang sebenarnya.
theillien
1

sha512 htpasswd

Perintah yang meminta pengguna dan kata sandi dan menghasilkan file htpasswd biasa:

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

Bekerja dengan semua versi python> 2.5.

MadMike
sumber
1

OpenSSL memiliki

openssl passwd -6

Bantuan mengatakan:

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

Jika Anda menggunakan metode Python (> = 2.7) dari jawaban sim dan ingin mengonfirmasi kata sandi Anda sebelum membuatnya - karena kata sandi Anda gemuk, ...

$ python -c 'import crypt,getpass;pw=getpass.getpass(); print(crypt.crypt(pw), crypt.mksalt(crypt.METHOD_SHA512) if (pw==getpass.getpass("Confirm: ")) else exit())'
pungutan
sumber
Dalam versi 29 November 2017 dari jawaban ini, dikatakan ini berfungsi untuk python 2.7 (atau lebih baru). Modul crypt dari python2.7 tidak memiliki mksalt (). Juga saya pikir Anda ingin panggilan crypt.mksalt () sebagai arg ke-2 ke crypt.crypt () (salah tutup paren?).
Juan
0

openssl versi "OpenSSL 1.1.1" di Linux dan versi openssl "LibreSSL 2.6.5" di MacOS mendukung md5_crypt.

Jalankan dan masukkan kata sandi:

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

atau berikan kata sandi teks polos langsung ke CLI:

openssl password -crypt <plain_text_password_goes_here>
<results_into_a_md5_crypt_password>
TMT
sumber
-12

Anda bisa menggunakan sha512sum:

echo "password" | sha512sum
Vinayak
sumber
24
Jawaban ini salah. Perintah tidak akan menghasilkan hash kata sandi SHA-512 yang valid . Ini hanya akan menghitung checksum dari kata sandi string \ n (perhatikan bahwa pada akhirnya ada juga baris baru). Hash kata sandi Unix di asin dan sertakan kode versi hash antara dua simbol "$". Lihat jawabannya oleh @slm.
zorlem
Lebih khusus, masalahnya adalah bahwa sementara kata sandi agak dikaburkan, metode ini rentan terhadap serangan en.wikipedia.org/wiki/Rainbow_table .
DepressedDaniel