Tại sao các muối làm cho các cuộc tấn công từ điển trở nên 'bất khả thi'?


85

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.


12
Toàn bộ điểm trong việc ướp muối là ngăn bạn không thể nhìn vào mật khẩu đã băm và thấy rằng nhiều người dùng có cùng một băm (và do đó cùng một mật khẩu). Không cần muối, bạn chỉ có thể sử dụng thuật toán băm và tạo mọi hàm băm có thể và sau đó thực hiện tìm kiếm thô bạo cho hàm băm đó. Vì thuật toán không bao giờ thay đổi nên những kẻ tấn công có thể dự đoán được, việc ướp muối chỉ khiến nó trở nên khó khăn hơn nhiều.
BeRecursive

25
Bởi vì bánh quy giòn giống như sên, và muối sẽ làm khô niêm mạc trên da và giết chết chúng.
TED

6
@TED: Tôi thích bánh quy giòn hơn. Sên mặn, không nên nhiều.
FrustratedWithFormsDesigner

3
@Tom - trong cuộc tấn công ví dụ của bạn. Nếu không có muối, thì kẻ tấn công có thể làm "đối với mỗi mật khẩu chung, băm mật khẩu. Điều này có khớp với một hoặc nhiều người dùng không? Có, tôi có mật khẩu của họ" - kẻ tấn công có thể tấn công tất cả các mật khẩu "song song" , không có phụ phí.
Damien_The_Un Believer

3
@Tom Gullen - bạn chỉ có một nửa bức tranh. Nếu không có muối, kẻ tấn công sẽ không sử dụng phương pháp bạn trình bày trong "Bản cập nhật 2". Anh ta chỉ cần thực hiện tra cứu trong bảng và lấy mật khẩu trong thời gian O (1) hoặc O (log n) (n là số mật khẩu ứng viên). Muối là thứ ngăn cản điều đó và buộc anh ta phải sử dụng phương pháp O (n) mà bạn chứng minh. Một kỹ thuật khác (tăng cường khóa) có thể khiến mỗi lần thử trong vòng lặp của bạn mất trọn một giây, có nghĩa là sẽ mất 3 năm để thực hiện các bài kiểm tra đó ... và chỉ với 10k mật khẩu, bạn có khả năng bẻ khóa bằng không mật khẩu trong đó thời gian.
erickson

Câu trả lời:


31

Có, bạn chỉ cần 3 ngày cho sha1 (muối | mật khẩu). Đó là lý do tại sao các thuật toán lưu trữ mật khẩu tốt sử dụng phương pháp băm 1000 lần lặp: bạn sẽ cần 8 năm.


3
+1, câu trả lời ngắn gọn nhất và cho đến nay, tôi không biết đây là một lựa chọn.
Tom Gullen

Rõ ràng bạn chưa bao giờ thực hiện một tiêu chuẩn băm trên hệ thống của mình. Bạn có thể thực hiện NHIỀU TRIỆU phép tính sha1 mỗi giây. 1.000 viên đạn là vô nghĩa đối với kẻ tấn công. Ngoài ra -1 vì sha1 là một hàm băm bị hỏng.
rook

Rõ ràng tôi đang sử dụng tên và số từ câu hỏi. Nếu bạn đã từng nghe về những thứ như chủ đề và sự rõ ràng ... thì đó là Rook. Đừng bận tâm.
blaze

1
@ Nhìn kìa, 1.000 viên đạn có nghĩa là sẽ lâu hơn 1.000 lần để bạo lực. Có vẻ như một tính năng tốt đối với tôi.
Tom Gullen

nếu kẻ tấn công có thể đoán mật khẩu, đây có phải là tương tự cho đăng nhập (hoặc một cái gì đó đã trốn thoát với tôi lol?)
khaled_webdev

62

Nó không ngăn chặn các cuộc tấn công từ điển.

Những gì nó làm là ngăn người quản lý lấy bản sao tệp mật khẩu của bạn bằng cách sử dụng bảng cầu vồng để tìm ra mật khẩu là gì từ các hàm băm.

Tuy nhiên, cuối cùng, nó có thể bị cưỡng bức. Câu trả lời cho phần đó là buộc người dùng của bạn không sử dụng các từ trong từ điển làm mật khẩu (ví dụ: yêu cầu tối thiểu của ít nhất một số hoặc ký tự đặc biệt).

Cập nhật :

Đáng lẽ tôi đã đề cập đến vấn đề này sớm hơn, nhưng một số (hầu hết?) Hệ thống mật khẩu sử dụng một muối khác nhau cho mỗi mật khẩu, có thể được lưu trữ bằng chính mật khẩu đó. Điều này làm cho một bảng cầu vồng duy nhất trở nên vô dụng. Đây là cách hoạt động của thư viện mã hóa UNIX và các hệ điều hành giống UNIX hiện đại đã mở rộng thư viện này bằng các thuật toán băm mới.

Tôi biết thực tế là hỗ trợ SHA-256 và SHA-512 đã được thêm vào trong các phiên bản mới hơn của GNU crypt.


17
Muối +1 ngăn danh sách băm (bảng cầu vồng) được tính toán trước không hữu ích. Kẻ tấn công phải bắt đầu lại tất cả.
Ian Boyd

2
Trong PHP, bạn có thể sử dụng thư viện mcrypt hoặc bcrypt để mã hóa tốt hơn md5 hoặc sha1. Nếu bạn bị mắc kẹt với md5 hoặc sha1, bạn nên 'kéo dài', nơi bạn băm mật khẩu hàng nghìn lần trước khi bạn nhận được bất kỳ thứ gì được lưu trữ trong cơ sở dữ liệu. Điều này giữ nguyên entropy, nhưng làm tăng thời gian tính toán băm.
Malfist

2
@Tom Gullen, bạn đang đọc bài báo nào vậy? Các chuyên gia tự nhận hay các bài báo bình duyệt trên tạp chí khoa học?
Malfist

7
Và đó là nhà phát triển Joe trung bình của bạn tạo các bài đăng trợ giúp / blog đó về cách viết một hệ thống "an toàn". Bảo mật không phải là thứ bạn có thể nhận được ở bên, nó đòi hỏi kiến ​​thức sâu rộng. Có bất công không? Có lẽ. Nó có an toàn không? Đến một mức độ. Có những lý do có các chuyên gia bảo mật. Nhưng một lần nữa, không phải mọi thứ đều phải an toàn như Fort Knox. Chính sách tốt nhất ở đây là sử dụng một hệ thống dựng sẵn được thiết kế bởi những chuyên gia đó và sửa đổi nó để đáp ứng nhu cầu của bạn.
Malfist

3
@Michael: Với một muối dài hơn, bạn cần tính toán trước tất cả các giá trị muối có thể có để nó hiển thị trong bảng cầu vồng. Vấn đề là bạn không giữ cùng một muối cho tất cả các mật khẩu, bạn chọn ngẫu nhiên cho mỗi mật khẩu và lưu trữ nó trong cơ sở dữ liệu bên cạnh mật khẩu muối băm được lưu trữ. Vì vậy, một tin tặc sẽ cần một mục nhập trong bảng cầu vồng cho mỗi muối có giá trị lớn có thể có, khiến bảng quá lớn không thể thực hiện được, đó là điểm chính.
Colin DeClue

31

Nói chính xác hơn, một cuộc tấn công từ điển , tức là một cuộc tấn công trong đó tất cả các từ trong danh sách đầy đủ được thử, không phải là "không thể", nhưng nó trở nên không thực tế : mỗi bit muối tăng gấp đôi lượng lưu trữ và tính toán cần thiết .

Điều này khác với các cuộc tấn công từ điển được tính toán trước như các cuộc tấn công liên quan đến các bảng cầu vồng, nơi không quan trọng muối có bí mật hay không.

Ví dụ: Với muối 64-bit (tức là 8 byte), bạn cần kiểm tra 2 tổ hợp 64 mật khẩu bổ sung trong cuộc tấn công từ điển của mình. Với một từ điển chứa 200.000 từ, bạn sẽ phải làm

200.000 * 2 64 = 3,69 * 10 24

kiểm tra trong trường hợp xấu nhất - thay vì 200.000 bài kiểm tra không có muối.

Một lợi ích bổ sung của việc sử dụng muối là kẻ tấn công không thể tính toán trước các băm mật khẩu từ từ điển của mình. Nó chỉ đơn giản là sẽ mất quá nhiều thời gian và / hoặc không gian.

Cập nhật

Bản cập nhật của bạn giả định rằng kẻ tấn công đã biết muối (hoặc đã đánh cắp nó). Tất nhiên đây là một tình huống khác. Tuy nhiên, kẻ tấn công không thể sử dụng bảng cầu vồng được tính toán trước. Điều quan trọng ở đây là tốc độ của hàm băm. Để thực hiện một cuộc tấn công không thực tế, hàm băm cần phải chậm. MD5 hoặc SHA không phải là ứng cử viên tốt ở đây vì chúng được thiết kế để nhanh, ứng cử viên tốt hơn cho thuật toán băm là Blowfish hoặc một số biến thể của nó.

Cập nhật 2

Bài đọc hay về vấn đề bảo mật hàm băm mật khẩu của bạn nói chung (vượt xa câu hỏi ban đầu nhưng vẫn thú vị):

Đủ với các bảng cầu vồng: Những điều bạn cần biết về lược đồ mật khẩu an toàn

Kết quả của bài viết: Sử dụng hàm băm muối được tạo bằng bcrypt (dựa trên Blowfish) hoặc Eksblowfish cho phép bạn sử dụng thời gian thiết lập có thể định cấu hình để làm chậm quá trình băm.


4
@Tom Gullen - ngay cả với các chính sách mật khẩu mạnh hợp lý, một từ điển hàng trăm triệu hoặc vài tỷ ứng cử viên vẫn có khả năng nhận được một số lượt truy cập, bởi vì tất cả các mật khẩu đều không có khả năng như nhau (vì mọi người sử dụng kỹ thuật ghi nhớ, thay vì RNG, để chọn chúng) . Từ điển có kích thước như vậy có thể tính toán trước trên các hệ thống hàng hóa nếu muối không được sử dụng. Nếu dùng muối, kẻ tấn công phải tính toán lại hàm băm mỗi lần và nếu thực hiện đủ số lần lặp lại hàm băm, tốc độ tấn công của kẻ tấn công có thể bị chậm lại vài lần thử mỗi giây.
erickson

3
-1 từ tôi: được giữ bí mật hoàn toàn không phải là vấn đề của muối. Dù sao thì bạn cũng cần chúng có thể truy cập được để kiểm tra mật khẩu, vì vậy bất kỳ nỗ lực giữ bí mật nào đều có khả năng khiến hệ thống dễ bị tấn công hơn do phức tạp hơn thay vì thực sự thành công.
Michael Borgwardt

2
@ 0xA3: một lần nữa: bị kẻ tấn công không biết đến không phải là vấn đề . Máy của bạn cần truy cập vào nó theo một cách nào đó, vì vậy kẻ tấn công đột nhập vào máy cũng có thể lấy được. Bất kỳ tình huống nào mà kẻ tấn công không biết muối là cá trích đỏ.
Michael Borgwardt

1
Tôi nghĩ điều đáng nói là bài báo được liên kết mô tả sai các bảng cầu vồng. Những gì anh ta mô tả là một từ điển đính kèm đơn giản. Bảng cầu vồng thực sự khá khác biệt (và có phần phức tạp hơn). Có một lời giải thích khá tốt về cách bảng cầu vồng thực sự làm việc tại địa chỉ: kestas.kuliukas.com/RainbowTables
Jerry Coffin

3
-1 cho "Tất nhiên muối cần được giữ bí mật". Nếu kẻ tấn công có quyền truy cập vào hàm băm mật khẩu của bạn, chúng cũng sẽ có muối của bạn - những gì bạn cần là muối của mỗi người dùng , chứ không phải sự bảo mật thông qua việc che giấu muối "ẩn".
Snemarch,

17

Từ điển là một cấu trúc nơi các giá trị được lập chỉ mục bởi các khóa. Trong trường hợp tấn công từ điển được tính toán trước, mỗi khóa là một hàm băm và giá trị tương ứng là một mật khẩu dẫn đến hàm băm. Với một từ điển được tính toán trước trong tay, kẻ tấn công có thể "ngay lập tức" tra cứu một mật khẩu sẽ tạo ra hàm băm cần thiết để đăng nhập.

Với muối, không gian cần thiết để lưu trữ từ điển tăng lên nhanh chóng… nhanh đến mức cố gắng tính toán trước từ điển mật khẩu sẽ sớm trở nên vô nghĩa.

Các muối tốt nhất được chọn ngẫu nhiên từ bộ tạo số ngẫu nhiên mật mã. Tám byte là kích thước thực tế và hơn 16 byte không phục vụ mục đích gì.


Muối không chỉ "làm cho công việc của kẻ tấn công trở nên khó chịu hơn." Nó loại bỏ toàn bộ lớp tấn công — việc sử dụng từ điển được tính toán trước.

Một yếu tố khác là cần thiết để bảo mật hoàn toàn mật khẩu và đó là "tăng cường khóa". Một vòng SHA-1 là không đủ tốt: một thuật toán băm mật khẩu an toàn nên tính toán rất chậm.

Nhiều người sử dụng PBKDF2, một hàm dẫn xuất khóa, cung cấp lại kết quả cho hàm băm hàng nghìn lần. Thuật toán "bcrypt" cũng tương tự, sử dụng dẫn xuất khóa lặp lại chậm.

Khi thao tác băm diễn ra rất chậm, một bảng tính toán trước ngày càng trở nên mong muốn hơn đối với kẻ tấn công. Nhưng muối thích hợp đánh bại cách tiếp cận đó.


Bình luận

Dưới đây là những nhận xét tôi đưa ra về câu hỏi.


Nếu không có muối, kẻ tấn công sẽ không sử dụng phương pháp được trình bày trong "Bản cập nhật 2". Anh ta chỉ cần thực hiện tra cứu trong một bảng được tính toán trước và lấy mật khẩu trong thời gian O (1) hoặc O (log n) (n là số mật khẩu ứng viên). Muối là thứ ngăn cản điều đó và buộc anh ta phải sử dụng phương pháp O (n) được trình bày trong "Bản cập nhật 2".

Sau khi giảm thành một cuộc tấn công O (n), chúng ta phải xem xét mỗi lần thử mất bao lâu. Việc tăng cường khóa có thể khiến mỗi lần thử trong vòng lặp mất một giây, nghĩa là thời gian cần thiết để kiểm tra 10k mật khẩu trên 10k người dùng sẽ kéo dài từ 3 ngày đến 3 năm … và chỉ với 10k mật khẩu, bạn có khả năng bẻ khóa bằng không mật khẩu trong thời gian đó.

Bạn phải cân nhắc rằng kẻ tấn công sẽ sử dụng các công cụ nhanh nhất mà anh ta có thể, không phải PHP, vì vậy hàng nghìn lần lặp, thay vì 100, sẽ là một tham số tốt để tăng cường khóa. Sẽ mất một phần lớn giây để tính toán băm cho một mật khẩu.

Tăng cường khóa là một phần của thuật toán dẫn xuất khóa tiêu chuẩn PBKDF1 và PBKDF2, từ PKCS # 5, tạo ra các thuật toán xáo trộn mật khẩu tuyệt vời ("khóa dẫn xuất" là "băm").

Rất nhiều người dùng trên StackOverflow tham khảo bài viết này vì nó là phản hồi cho bài đăng của Jeff Atwood về sự nguy hiểm của bảng cầu vồng. Đây không phải là bài viết yêu thích của tôi, nhưng nó thảo luận chi tiết hơn về những khái niệm này.


Tất nhiên bạn cho rằng kẻ tấn công có mọi thứ: muối, băm, tên người dùng. Giả sử kẻ tấn công là một nhân viên của công ty lưu trữ tham nhũng đã làm đổ bảng người dùng trên fansite myprettypony.com của bạn. Anh ấy đang cố gắng khôi phục những mật khẩu này vì anh ấy sẽ quay lại và xem liệu người hâm mộ ngựa của bạn có sử dụng cùng một mật khẩu trên tài khoản citibank.com của họ hay không.

Với một sơ đồ mật khẩu được thiết kế tốt, anh chàng này sẽ không thể khôi phục được bất kỳ mật khẩu nào.


1
Tôi nghĩ rằng bằng cách "tấn công từ điển", Tom ám chỉ việc thử các mật khẩu yếu đã biết (tức là lấy thẳng từ từ điển tiếng người), không phải bảng băm-bản rõ được tính toán trước - đây cũng là điều tôi nghĩ đến đầu tiên khi đọc "từ điển" bối cảnh này.
Michael Borgwardt

@Michael Borgwardt: Tôi đồng ý, @erickson đề cập đến các cuộc tấn công từ điển được tính toán trước.
Dirk Vollmar

1
Salt ngăn chặn các cuộc tấn công từ điển được tính toán trước. Tăng cường phím ngăn chặn các cuộc tấn công từ điển. Cả hai phải được sử dụng cùng nhau để xác thực mật khẩu an toàn.
erickson

Tôi có nghĩa là bảng tiếng Anh đơn giản có. Mục đích câu hỏi để giải quyết vấn đề làm thế nào để ngăn chặn một hacker làm việc tất cả các kết hợp có thể băm cho mỗi tài khoản người dùng
Tom Gullen

7

Mục đích của việc ướp muối là để ngăn chặn sự hao mòn công sức của kẻ tấn công.

Không có muối, một bảng duy nhất các mục nhập mật khẩu băm được tính toán trước (ví dụ: MD5 của tất cả các chuỗi ký tự gồm 5 chữ và số, dễ dàng tìm thấy trực tuyến) có thể được sử dụng cho mọi người dùng trong mọi cơ sở dữ liệu trên thế giới.

Với một muối dành riêng cho trang web, kẻ tấn công phải tự tính toán bảng và sau đó có thể sử dụng nó trên tất cả người dùng của trang web.

Với muối cho mỗi người dùng, kẻ tấn công phải sử dụng nỗ lực này cho từng người dùng riêng biệt.

Tất nhiên, điều này không có tác dụng gì nhiều để bảo vệ các mật khẩu thực sự yếu ngay từ từ điển, nhưng nó bảo vệ các mật khẩu mạnh hợp lý chống lại sự suy giảm này.


1
Câu trả lời ngắn gọn và chính xác - đáng để nói thêm rằng không có muối hoặc với muối trên toàn trang web, bạn có thể dễ dàng phát hiện ra những người dùng có cùng mật khẩu và sẽ chỉ cần dùng mật khẩu. Với các muối cho mỗi người dùng, bạn không thể làm điều đó.
Snemarch,

6

Ngoài ra - một điểm quan trọng nữa - sử dụng muối dành riêng cho NGƯỜI DÙNG sẽ ngăn việc phát hiện hai người dùng có cùng mật khẩu - hàm băm của họ sẽ khớp. Đó là lý do tại sao nhiều lần băm là băm (muối + tên người dùng + mật khẩu)

Nếu bạn cố gắng và giữ bí mật mã băm, kẻ tấn công cũng không thể xác minh các hàm băm.

Chỉnh sửa- chỉ cần nhận thấy điểm chính được đưa ra trong một bình luận ở trên.


1
Bạn nên chỉnh sửa để chỉ định muối cho mỗi người dùng; các trang web sử dụng muối trên toàn trang sẽ vẫn cho phép bạn phát hiện các mật khẩu giống hệt nhau.
Snemarch,

@snemarch - Vâng- cảm ơn bạn rất nhiều về sự khác biệt quan trọng này!
Dominik Weber

5

Salts được thực hiện để ngăn chặn các cuộc tấn công bảng cầu vồng. Bảng cầu vồng là danh sách các hàm băm được tính toán trước, điều này làm cho việc dịch một hàm băm thành cụm từ của nó đơn giản hơn nhiều. Bạn cần hiểu rằng việc ướp muối không hiệu quả như một biện pháp ngăn chặn hiện đại để bẻ khóa mật khẩu trừ khi chúng ta có thuật toán băm hiện đại.

Vì vậy, giả sử chúng tôi đang làm việc với SHA1, tận dụng các khai thác gần đây được phát hiện với thuật ngữ này, và giả sử chúng tôi có một máy tính chạy ở 1.000.000 băm / giây, sẽ mất 5,3 triệu triệu triệu năm để tìm thấy một vụ va chạm , vậy php có thể hoạt động 300 một giây, tiếng kêu lớn, không thực sự quan trọng. Lý do khiến chúng ta muối mặt là vì nếu ai đó đã bận tâm tạo ra tất cả các cụm từ điển thông dụng, (2 ^ 160 người, chào mừng bạn đến với các kỳ tích thời đại 2007).

Vì vậy, đây là một cơ sở dữ liệu thực tế, với 2 người dùng mà tôi sử dụng cho mục đích thử nghiệm và quản trị.

RegistrationTime        UserName        UserPass    
1280185359.365591       briang      a50b63e927b3aebfc20cd783e0fc5321b0e5e8b5
1281546174.065087       test        5872548f2abfef8cb729cac14bc979462798d023

Trên thực tế, sơ đồ ướp muối là sha1 của bạn (thời gian đăng ký + tên người dùng). Tiếp tục, cho tôi biết mật khẩu của tôi, đây là mật khẩu thực trong quá trình sản xuất. Bạn thậm chí có thể ngồi đó và băm ra một danh sách từ trong php. Đi hoang dã.

Tôi không điên, tôi chỉ biết rằng điều này được bảo mật. Vì lợi ích vui vẻ, mật khẩu của thử nghiệm là test. sha1(sha1(1281546174.065087 + test) + test) = 5872548f2abfef8cb729cac14bc979462798d023

Bạn sẽ cần tạo toàn bộ bảng cầu vồng chỉ27662aee8eee1cb5ab4917b09bdba31d091ab732 dành cho người dùng này. Điều đó có nghĩa là tôi thực sự có thể cho phép tất cả mật khẩu của mình không bị xâm phạm bởi một bảng cầu vồng duy nhất, tin tặc cần tạo toàn bộ bảng cầu vồng cho 27662aee8eee1cb5ab4917b09bdba31d091ab732 để kiểm tra và một lần nữa f3f7735311217529f2e020468004a2aa5b3dee7f cho briang. Hãy nhớ lại 5,3 triệu triệu triệu năm cho tất cả các hàm băm. Hãy nghĩ về kích thước chỉ lưu trữ 2 ^ 80 băm (tức là hơn 20 yottabyte ), điều đó sẽ không xảy ra.

Đừng nhầm lẫn việc ướp muối là một phương tiện tạo ra một hàm băm mà bạn không bao giờ có thể giải mã, đó là một phương tiện ngăn bảng cầu vồng dịch tất cả mật khẩu người dùng của bạn. Nó khả dụng ở cấp độ công nghệ này.


Tôi hiểu bảng cầu vồng là gì, nhưng bạn đang thiếu điểm trong câu hỏi của tôi. Nếu bạn cung cấp cho tôi thuật toán ướp muối, mật khẩu băm và muối, thì có thể tôi sẽ cho bạn biết mật khẩu của bạn là gì trong vòng vài phút.
Tom Gullen

Đặt tiền của bạn, nơi miệng của bạn?
Incognito

Chắc chắn rồi, nhưng bạn vừa cho tôi biết mật khẩu trong ví dụ của bạn là gì, hãy cho tôi một mật khẩu muối, băm và cách bạn kết hợp muối + mật khẩu (không đệ quy) và miễn là mật khẩu <= 5 ký tự chữ và số viết thường (không có khoảng trắng / ký tự đặc biệt) Tôi sẽ cho bạn biết nó có gì trong hộp này. Nếu bạn muốn tôi bỏ tiền vào nó như bạn đề nghị, hãy cho tôi biết, mặc dù nhận xét của tôi trong vài phút có lẽ là một đánh giá thấp, nhưng trong vài giờ thì có.
Tom Gullen,

1
Thực tế có thể là vài giây, hãy xem golubev.com/hashgpu.htm sử dụng GPU để tính toán như được trích dẫn "2300M / s SHA1 băm mỗi giây". Với đầy đủ 95 ký tự ASCII khác nhau, từ 1-6 ký tự, chúng tôi có thể bẻ khóa nó trong vòng <6 phút. Nếu chúng ta chỉ có ký tự chữ và số viết thường, tối đa 8 ký tự có độ dài <25 phút. Với cơ sở dữ liệu gồm 10.000 hồ sơ người dùng, chúng tôi có thể tìm thấy tất cả 4 mật khẩu ASCII đầy đủ ký tự trong <200 giây ((((95 ^ 4) / 2300000000) / 2) * 10000). (Chi phí cao hơn so với báo giá và tốc độ GPU được trích dẫn có lẽ là tình huống lý tưởng).
Tom Gullen,

Đúng vậy, việc ướp muối không ngăn cản bạn có thể cưỡng bức mật khẩu đó. Nó khiến bạn khó tạo ((10 ^ 5) * (94 ^ 10)) = 10 ^ 24 nếu người dùng có mật khẩu 10 ký tự, khó hơn nhiều so với 10 ^ 19 không có băm. Một lần nữa, việc phá một mật khẩu không khó mà là làm cho việc phá tất cả các mật khẩu trở nên khó khả thi với một bảng cầu vồng đã được xử lý trước. (và kiểm tra phép toán của tôi ở đây, nhưng tôi tin rằng 10 ^ 25 / 2300000000/60/60/24/365/1000 = 137 869 ~ milinea cho mật khẩu của mọi người). Nếu chúng ta muốn mật khẩu mạnh hơn, chúng ta không muối chúng, chúng ta sử dụng những thứ như trao đổi khóa Diffie – Hellman.
Incognito

3

Ý tưởng đằng sau cuộc tấn công từ điển là bạn lấy một hàm băm và tìm mật khẩu, từ đó hàm băm này được tính toán mà không cần tính toán hàm băm. Bây giờ làm tương tự với mật khẩu muối - bạn không thể.

Việc không sử dụng muối giúp việc tìm kiếm mật khẩu dễ dàng như tra cứu trong cơ sở dữ liệu. Thêm một muối làm cho kẻ tấn công thực hiện tính toán băm của tất cả các mật khẩu có thể có (ngay cả đối với từ điển đính kèm điều này làm tăng đáng kể thời gian tấn công).


Trong kịch bản của OP, kẻ tấn công các muối từ cơ sở dữ liệu và sẽ phải thử mọi muối với mọi mục nhập trong "từ điển". ...Tôi nghĩ.
FrustratedWithFormsDesigner

2

Nói một cách đơn giản nhất: không cần ướp muối, mỗi mật khẩu ứng viên chỉ cần được băm một lần để kiểm tra nó với mọi người dùng, ở bất kỳ đâu trong "vũ trụ đã biết" (tập hợp các cơ sở dữ liệu bị xâm phạm), có mật khẩu được băm thông qua cùng một thuật toán. Với tính năng ướp muối, nếu số lượng giá trị muối có thể có về cơ bản vượt quá số lượng người dùng trong "vũ trụ đã biết", thì mỗi mật khẩu ứng viên phải được băm riêng cho từng người dùng mà nó sẽ được kiểm tra.


2

Nói một cách đơn giản, việc ướp muối không ngăn chặn tấn công băm (bruteforce hoặc từ điển), nó chỉ làm cho nó khó hơn; kẻ tấn công sẽ cần phải tìm ra thuật toán muối (nếu được triển khai đúng cách sẽ sử dụng nhiều lần lặp hơn) hoặc bruteforce algo, trừ khi rất đơn giản, gần như là không thể. Salting cũng gần như loại bỏ hoàn toàn tùy chọn tra cứu bảng cầu vồng ...


1

Muối làm bàn Cầu vồng các cuộc tấn công trở nên khó khăn hơn nhiều vì nó làm cho một hàm băm mật khẩu khó bị bẻ khóa hơn nhiều. Hãy tưởng tượng bạn có một mật khẩu khủng khiếp chỉ là số 1. Một cuộc tấn công bảng cầu vồng sẽ phá vỡ mật khẩu này ngay lập tức.

Bây giờ hãy tưởng tượng mỗi mật khẩu trong db là muối với một giá trị ngẫu nhiên dài của nhiều ký tự ngẫu nhiên. Bây giờ mật khẩu tệ hại của bạn là "1" được lưu trữ trong db dưới dạng băm của 1 cộng với một loạt các ký tự ngẫu nhiên (muối), vì vậy trong ví dụ này, bảng cầu vồng cần có băm cho một cái gì đó như: 1.

Vì vậy, giả sử muối của bạn là thứ gì đó an toàn và ngẫu nhiên, giả sử ()% ISLDGHASKLU ( % #% #, bảng cầu vồng của hacker sẽ cần có mục nhập cho 1 * ()% ISLDGHASKLU (*% #% #. Bây giờ sử dụng bảng cầu vồng thậm chí mật khẩu đơn giản này không còn thực tế nữa.


Vui lòng xem bản cập nhật # 2, bạn chỉ cần có mật khẩu thô và tính toán tất cả các hàm băm theo muối cho mỗi bản ghi người dùng.
Tom Gullen

2
Chắc chắn Tom, tôi đồng ý, nhưng vấn đề là hacker phải thực hiện quá trình tốn thời gian xấu xí đó một lần cho mỗi mật khẩu nếu muối được sử dụng. Vì vậy, muối làm cho việc sử dụng bàn cầu vồng khó hơn.
Cory House

3
@Tom Gullen: tạo bảng cầu vồng muối chỉ khả thi nếu sử dụng muối trên toàn bộ trang web; cho mỗi người dùng muối làm cho các cuộc tấn công bảng cầu vồng trở nên vô dụng.
Snemarch,
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.