Cập nhật: Xin lưu ý rằng tôi không hỏi muối là gì, bảng cầu vồng là gì, tấn công từ điển là gì, hoặc mục đích của muối là gì. Tôi đang truy vấn: Nếu bạn biết người dùng muối và băm, thì không phải là dễ dàng để tính mật khẩu của họ phải không?
Tôi hiểu quy trình và tự thực hiện nó trong một số dự án của mình.
s = random salt
storedPassword = sha1(password + s)
Trong cơ sở dữ liệu bạn lưu trữ:
username | hashed_password | salt
Mọi triển khai muối tôi đã thấy đều thêm muối vào cuối mật khẩu hoặc bắt đầu:
hashed_Password = sha1(s + password )
hashed_Password = sha1(password + s)
Do đó, một cuộc tấn công từ điển từ một hacker đáng giá muối của anh ta (ha ha) sẽ chỉ đơn giản là chạy mỗi từ khóa đối với các muối được lưu trữ trong các kết hợp phổ biến được liệt kê ở trên.
Chắc chắn việc triển khai được mô tả ở trên chỉ đơn giản là thêm một bước nữa cho hacker mà không thực sự giải quyết được vấn đề cơ bản? Có những giải pháp thay thế nào để giải quyết vấn đề này, hoặc tôi đang hiểu sai vấn đề?
Điều duy nhất tôi có thể nghĩ phải làm là có một thuật toán kết hợp bí mật kết hợp muối và mật khẩu với nhau theo một mẫu ngẫu nhiên hoặc thêm các trường người dùng khác vào quá trình băm nghĩa là tin tặc sẽ phải có quyền truy cập vào cơ sở dữ liệu VÀ mã để tạo ra chúng cho một cuộc tấn công từ điển để chứng minh hiệu quả. (Cập nhật, như đã chỉ ra trong các nhận xét, tốt nhất là giả sử hacker có quyền truy cập vào tất cả thông tin của bạn, vì vậy điều này có lẽ không phải là tốt nhất).
Hãy để tôi đưa ra một ví dụ về cách tôi đề xuất một hacker sẽ tấn công cơ sở dữ liệu người dùng bằng danh sách mật khẩu và mã băm:
Dữ liệu từ cơ sở dữ liệu bị tấn công của chúng tôi:
RawPassword (not stored) | Hashed | Salt
--------------------------------------------------------
letmein WEFLS... WEFOJFOFO...
Từ điển mật khẩu chung:
Common Password
--------------
letmein
12345
...
Đối với mỗi bản ghi người dùng, lặp lại các mật khẩu phổ biến và băm chúng:
for each user in hacked_DB
salt = users_salt
hashed_pw = users_hashed_password
for each common_password
testhash = sha1(common_password + salt)
if testhash = hashed_pw then
//Match! Users password = common_password
//Lets visit the webpage and login now.
end if
next
next
Tôi hy vọng điều này minh họa quan điểm của tôi tốt hơn nhiều.
Với 10.000 mật khẩu phổ biến và 10.000 hồ sơ người dùng, chúng tôi sẽ cần tính toán 100.000.000 băm để khám phá càng nhiều mật khẩu người dùng càng tốt. Có thể mất vài giờ, nhưng nó không thực sự là một vấn đề.
Cập nhật về lý thuyết nứt
Chúng tôi sẽ cho rằng chúng tôi là một webhost bị hỏng, có quyền truy cập vào cơ sở dữ liệu gồm các hàm băm và muối SHA1, cùng với thuật toán của bạn để kết hợp chúng. Cơ sở dữ liệu có 10.000 hồ sơ người dùng.
Trang web này tuyên bố có thể tính toán 2.300.000.000 SHA1 băm mỗi giây bằng cách sử dụng GPU. (Trong tình huống thực tế có thể sẽ chậm hơn, nhưng bây giờ chúng tôi sẽ sử dụng con số được trích dẫn đó).
(((95 ^ 4) / 2300000000) / 2) * 10000 = 177 giây
Cung cấp đầy đủ 95 ký tự ASCII có thể in được, với độ dài tối đa là 4 ký tự, chia cho tỷ lệ tính toán (biến), chia cho 2 (giả sử thời gian trung bình để khám phá mật khẩu sẽ yêu cầu 50% hoán vị) cho 10.000 người dùng sẽ mất 177 giây để tìm ra tất cả mật khẩu người dùng có độ dài <= 4.
Hãy điều chỉnh nó một chút cho chủ nghĩa hiện thực.
(((36 ^ 7) / 1000000000) / 2) * 10000 = 2 ngày
Giả sử không phân biệt chữ hoa chữ thường, với độ dài mật khẩu <= 7, chỉ có các ký tự chữ và số, thì sẽ mất 4 ngày để giải quyết cho 10.000 hồ sơ người dùng và tôi đã giảm một nửa tốc độ của thuật toán để phản ánh tình huống chi phí và không lý tưởng.
Điều quan trọng là phải nhận ra rằng đây là một cuộc tấn công bạo lực tuyến tính, tất cả các tính toán đều độc lập với nhau, do đó nó là một nhiệm vụ hoàn hảo cho nhiều hệ thống giải quyết. (IE dễ dàng thiết lập 2 máy tính chạy tấn công từ các đầu khác nhau sẽ giảm một nửa thời gian phát hiện).
Với trường hợp băm đệ quy mật khẩu 1.000 lần để làm cho tác vụ này tốn kém hơn về mặt tính toán:
(((36 ^ 7) / 1 000 000 000) / 2) * 1000 giây = 10,8839117 giờ
Điều này thể hiện độ dài tối đa là 7 ký tự chữ-số, với tốc độ thực thi chưa bằng một nửa so với con số được trích dẫn cho một người dùng .
Việc băm đệ quy 1.000 lần chặn một cách hiệu quả một cuộc tấn công bao trùm, nhưng các cuộc tấn công nhắm mục tiêu vào dữ liệu người dùng vẫn dễ bị tấn công.