Sản lượng ngẫu nhiên Slappasswd


10

Tôi đã mong đợi slappasswdtạo ra một hàm băm cố định nhưng có vẻ như đầu ra được chọn ngẫu nhiên vì tôi không bao giờ nhận được cùng một đầu ra cho cùng một mật khẩu đầu vào:

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

Trong quá trình xác thực, làm thế nào để slapd biết cách chọn ngẫu nhiên hàm băm cho mật khẩu được cung cấp theo cùng một cách để nó có thể khớp với mật khẩu được xác định ở vị trí đầu tiên?

Câu trả lời:


8

Đi ra ngoài một chi ở đây, nhưng tôi cho rằng slappasswd đang sử dụng băm muối thay vì băm đơn giản. Điều này có nghĩa là nó thêm tiền tố ngẫu nhiên vào mật khẩu của bạn và lưu tiền tố ngẫu nhiên đó như một phần của chuỗi bạn thấy trong đầu ra slappasswd. Khi bạn nhập mật khẩu, nó sẽ thêm tiền tố vào nó, băm kết quả và so sánh nó với chuỗi trong đầu ra slappasswd. Nếu nó khớp, bạn đang ở. Nếu không, mật khẩu của bạn đã sai :)


3
Thật. Cụ thể, phương thức băm mặc định cho slappasswdlà {SSHA} hoặc phiên bản muối của SHA-1.
justarobert

Tôi đồng ý, nhưng câu hỏi của tôi vẫn là: nếu muối kết thúc như một phần của hàm băm có nghĩa là bạn không thể trích xuất muối từ mật khẩu băm. Theo đó làm thế nào để slapd biết nên thêm muối gì khi thực hiện xác minh mật khẩu? (nó phải thêm cùng một loại muối để mật khẩu được băm giống nhau).
Tối đa

3
@user: Phần sau {SSHA}chứa cả muối và băm.
dùng1686

8

SSHA là một SHA-1 mặn. Theo mặc định, 4 byte cuối cùng là muối. Đầu ra của slappasswd là

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

Vì vậy, để kiểm tra, liệu mật khẩu văn bản đơn giản có bằng SHA đã được muối hay không, bạn cần phải:

  1. tước bộ xác định phương thức băm với ví dụ sed.
  2. giải mã chuỗi base64
  3. trích xuất 4 byte cuối cùng, đây là muối
  4. nối muối với mật khẩu văn bản đơn giản
  5. Đã trúng
  6. đối chiếu

Chuỗi được giải mã base64 chứa hàm băm ở dạng nhị phân và không thể được in, vì vậy chúng tôi sẽ chuyển đổi nó thành hex bằng od. 3 bước đầu tiên đang được thực hiện theo mã sau:

#!/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"

Đầu ra có thể là:

{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;▒

Vì vậy, bây giờ chúng ta phải nối muối với mật khẩu văn bản đơn giản và băm nó, lần này không có muối! Vấn đề tôi đã hiểu là muối thực sự có thể là bất kỳ ký tự nào, kể cả các ký tự không in được. Để ghép các ký tự không in được này, chúng tôi sẽ sử dụng printf và các biểu diễn thập lục phân của chúng:

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

Đầu ra là:

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

Mà bằng với hàm băm ở trên. Bây giờ chúng tôi đã xác minh, 'mật khẩu' khớp với SHA đã được muối.

Cảm ơn và đọc thêm: http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.