Output Slappasswd diacak

10

Saya mengharapkan slappasswduntuk menghasilkan hash tetap tetapi tampaknya output acak karena saya tidak pernah mendapatkan output yang sama untuk kata sandi input yang sama:

$ slappasswd -s secret
{SSHA}mCXsPZkfgQYZr2mKHpy5Iav+2S2XlVU3
$ slappasswd -s secret
{SSHA}62oXsalJBuopYfHhi6hGp6AESuWNIVnd
$ slappasswd -s secret
{SSHA}0Ulc8+ugMi3NbTtWnclOFW1LKCqRdsT8

Selama otentikasi, bagaimana slapd tahu cara mengacak hash untuk kata sandi yang diberikan dengan cara yang sama sehingga dapat mencocokkan kata sandi yang ditentukan di tempat pertama?

Maks
sumber

Jawaban:

8

Akan mengambil risiko di sini, tapi saya berasumsi slappasswd menggunakan hash asin daripada hash biasa. Ini berarti ia menambahkan awalan acak ke kata sandi Anda, dan menyimpan awalan acak itu sebagai bagian dari string yang Anda lihat di output slappasswd. Ketika Anda mengetik kata sandi Anda, itu menambahkan awalan untuk itu, hash hasilnya dan membandingkannya dengan string dalam output slappasswd. Jika cocok, Anda masuk. Jika tidak, kata sandi Anda salah :)

wzzrd
sumber
3
Memang. Secara khusus, metode hash default untuk slappasswdadalah {SSHA}, atau versi asin SHA-1.
justarobert
Saya setuju, tetapi pertanyaan saya tetap: jika garam berakhir sebagai bagian dari hash itu berarti Anda tidak dapat mengekstraksi garam dari kata sandi hash. Dengan demikian, bagaimana slapd tahu garam apa yang harus ditambahkan ketika melakukan verifikasi kata sandi? (harus menambahkan garam yang sama agar kata sandi hash tetap sama).
Maks.
3
@user: Bagian setelah {SSHA}mengandung kedua garam dan hash.
user1686
8

SSHA adalah SHA-1 asin. Secara default 4 Bytes terakhir adalah garam. Output dari slappasswd adalah

'{<Hash Method>}<base64 converted hash and salt>'

Jadi untuk menguji, apakah kata sandi teks biasa sama dengan SHA asin, Anda harus:

  1. lepaskan metode-specifier hash dengan misalnya sed.
  2. decode string base64
  3. ekstrak 4 byte terakhir, ini adalah garam
  4. menggabungkan garam ke kata sandi teks biasa
  5. hash itu
  6. membandingkan

String base64-decoded berisi hash dalam bentuk biner dan tidak dapat dicetak, jadi kita akan mengubahnya menjadi hex dengan od. 3 langkah pertama sedang dilakukan oleh kode berikut:

#!/bin/bash
output=$(slappasswd -h {SSHA} -s password)
hashsalt=$( echo -n $output | sed 's/{SSHA}//' | base64 -d)
salt=${hashsalt:(-1),(-4)}
echo $output
echo $(echo -n $hashsalt | od -A n -t x1)
echo "Salt: $salt"

Outputnya bisa:

{SSHA}fDu0PgKDn1Di9W1HMINpPXRqQ9jTYjuH

7c 3b b4 3e 02 83 9f 50 e2 f5 6d 47 30 83 69 3d 74 6a 43 d8 d3 62 3b 87
<------------------------- Hash --------------------------> <-- Salt-->

Salt: ▒b;▒

Jadi sekarang kita harus menggabungkan garam ke kata sandi teks biasa dan memotongnya, kali ini tanpa salting! Masalah yang saya miliki adalah pemahaman, bahwa garam dapat benar-benar karakter apa saja, termasuk karakter yang tidak dapat dicetak. Untuk menggabungkan karakter-karakter yang tidak dapat dicetak ini, kami akan menggunakan printf dan representasi heksadesimalnya:

slappasswd -h {SHA} -s $(printf 'password\xd3\x62\x3b\x87') | sed 's/{SHA}//' | base64 -d | od -A n -t x1

Outputnya adalah:

7c 3b b4 3e 02 83 9f 50 e2 f5 6d 47 30 83 69 3d 74 6a 43 d8

Yang sama dengan hash di atas. Sekarang kami telah memverifikasi, bahwa 'kata sandi' cocok dengan SHA asin.

Terima kasih dan bacaan lebih lanjut: http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm

mxmlnkn
sumber