it-swarm-vi.com

Tại sao sử dụng muối an toàn hơn?

Lưu trữ băm mật khẩu của người dùng, ví dụ: trong cơ sở dữ liệu, không an toàn vì mật khẩu của con người dễ bị tấn công từ điển. Mọi người đều gợi ý rằng điều này được giảm nhẹ thông qua việc sử dụng muối, nhưng muối được coi là không nhạy cảm và không cần phải được bảo vệ.

Trong trường hợp kẻ tấn công có muối, làm thế nào để cuộc tấn công từ điển của anh ta trở nên khó khăn hơn trước? Không có quyền truy cập vào muối, có hiệu quả, loại bỏ tính hữu dụng của nó?

51
Jim

Salt không bảo vệ bạn trước kẻ tấn công đơn độc chỉ sau một mật khẩu. Kẻ tấn công chỉ muốn phá một mật khẩu sẽ tính hash(salt + guess) thay vì hash(guess) (nếu lược đồ mật khẩu là hash(salt+password) ).

Salt giúp nếu kẻ tấn công muốn phá nhiều mật khẩu. Đây thường là trường hợp. Đôi khi kẻ tấn công đang tấn công một trang web và muốn đột nhập vào một tài khoản trên trang đó, bất kỳ tài khoản nào. Không có muối, hầu hết các công việc của kẻ tấn công có thể được sử dụng cho tất cả các tài khoản, vì vậy cô có thể kiểm tra từng nỗ lực của mình đối với tất cả các tài khoản cùng một lúc. Với một muối được chọn chính xác (nghĩa là nếu không có hai tài khoản có cùng một loại muối), kẻ tấn công phải bắt đầu lại cho mỗi mật khẩu được băm.

Hơn nữa, theo một nghĩa nào đó, tất cả các nỗ lực bẻ khóa mật khẩu đang cố gắng bẻ khóa tất cả mật khẩu tài khoản cùng một lúc. Đó là bởi vì băm có thể được tính toán trước; tất cả chỉ là để ai đó tạo ra bảng băm - hay hiệu quả hơn là bảng Rainbow - và công việc ban đầu đó có thể được phân phối cho nhiều kẻ tấn công có thể sử dụng nó trên bất kỳ cơ sở dữ liệu tài khoản nào sử dụng cùng thuật toán băm mật khẩu. Một lần nữa, muối làm cho các tính toán trước trở nên vô dụng.

Một cuộc tấn công mật khẩu vũ phu có thể được tóm tắt như thế này:

  1. Thực hiện bất kỳ tính toán trước nào mà kẻ tấn công thấy hữu ích, chẳng hạn như xây dựng bảng Rainbow (đây là một cách hiệu quả để biểu thị băm ánh xạ bảng thành mật khẩu phổ biến).
  2. Đối với mỗi một trong số các tài khoản n mà kẻ tấn công quan tâm đến việc xâm nhập và cho mọi tài khoản p mật khẩu đoán rằng kẻ tấn công bao gồm trong từ điển của cô ấy, kiểm tra xem hash(guess[i]) = hashed_password[j].

Theo cách tiếp cận ngây thơ, bước thứ hai yêu cầu n × p tính toán băm để thử tất cả các dự đoán đối với tất cả các tài khoản. Tuy nhiên, nếu bước đầu tiên đã tính tất cả các giá trị băm có thể, thì bước thứ hai không yêu cầu tính toán băm nào cả, chỉ cần kiểm tra xem mỗi hashed_password nằm trong cơ sở dữ liệu được tính toán trước, vì vậy cuộc tấn công yêu cầu chỉ cần n tra cứu bảng (điều này thậm chí có thể được tăng tốc, nhưng chúng tôi đã đi từ n x p tính toán chậm¹ xuống n tra cứu bảng).

Nếu mỗi mật khẩu có một loại muối khác nhau, thì để có ích, tiền mã hóa sẽ phải bao gồm một mục nhập cho mỗi giá trị muối có thể. Nếu muối đủ lớn, tiền mã hóa là không thể. Nếu tiền mã hóa không tính đến muối, sẽ không hữu ích để tăng tốc bước thứ hai, bởi vì bất kỳ hàm băm mật mã nào trộn lẫn đầu vào của nó: biết hàm băm của UIOQWHHXpassword không giúp tính toán hàm băm của NUIASZNApassword. Ngay cả để tấn công một tài khoản, kẻ tấn công cần thực hiện p tính toán băm để thử tất cả các dự đoán, đã là một cải tiến trong tra cứu bảng duy nhất là đủ nếu kẻ tấn công có một từ điển được tính toán trước.

¹ Không nên lưu trữ mật khẩu dưới dạng băm như SHA-1, mà sử dụng hàm băm chậm hơn như bcrypt hoặc scrypt hoặc PBKDF2 .

Tôi sẽ giải thích từng cấp độ bảo mật cho mật khẩu được lưu trữ cơ sở dữ liệu, có thể điều này sẽ giúp làm rõ tầm quan trọng của muối.

Cấp 1 : Mật khẩu được lưu rõ ràng trong cơ sở dữ liệu.

Đây chỉ là sự ngu ngốc thuần túy . Nhưng đôi khi, công ty lớn khiến cơ sở dữ liệu của họ bị xâm phạm và thật bất ngờ, tất cả mật khẩu đều được lưu trữ rõ ràng. Xấu hổ làm sao!

Cấp 2 : Mật khẩu được lưu trữ bằng thuật toán băm.

Đây là một bước để bảo mật hơn. Nếu kẻ tấn công có được mật khẩu băm, anh ta vẫn không thể đăng nhập bằng thông tin xác thực này cho dịch vụ. Trước tiên, anh ta sẽ phải "gỡ" mật khẩu bằng cách sử dụng Bảng cầu vồng hoặc bởi brute buộc. Điều đó có nghĩa là nó yêu cầu kẻ tấn công làm việc nhiều hơn một chút, nhưng vẫn có thể lấy lại mật khẩu ban đầu.

Cấp 3 : Mật khẩu được lưu trữ bằng thuật toán băm bằng muối.

Điều này bắt đầu thú vị. Như chúng ta đã thấy trên Cấp 2, kẻ tấn công có quyền truy cập vào mật khẩu được băm có thể dùng vũ lực hoặc sử dụng bảng Rainbow. Thêm một muối vào mật khẩu ban đầu làm cho bảng Rainbow hoàn toàn vô dụng vì chúng không xem xét đến muối. Vẫn có thể lấy chuỗi gốc bằng bảng Rainbow, nhưng điều đó có nghĩa là trong bảng Rainbow, mật khẩu + muối tồn tại. Vì một loại muối thường rất dài, nên số lẻ có giá trị băm của chuỗi (40+) là gần như không thể. Giải pháp duy nhất còn lại là vũ phu.

Cấp độ 4 : Mật khẩu được lưu trữ bằng thuật toán băm với muối và ớt.

Điều này rất thú vị (đó là lý do tại sao tôi đăng câu trả lời của mình vì những câu hỏi thực tế đã rất thú vị).

Tôi khuyên bạn nên sử dụng thuật toán băm như BCrypt, SCrypt hoặc PBKDF2 vì chúng chưa bị phá vỡ và rất chậm để hack, tăng thời gian phá vỡ và sau đó là cơ sở dữ liệu mật khẩu hoàn chỉnh.

Sự khác biệt giữa muối và hạt tiêu là vị trí của chúng. Muối thường được lưu trữ trong cơ sở dữ liệu nhưng hạt tiêu nằm trong mã. Điều này có vẻ kỳ lạ nhưng ý tưởng ban đầu là một cơ sở dữ liệu có thể bị xâm phạm, nhưng không phải là mã, để lại cho kẻ tấn công một muối và một danh sách mật khẩu băm vô dụng. Hơn nữa, nó còn tăng thêm độ phức tạp cho mật khẩu băm, làm cho bảng Rainbow hoàn toàn vô dụng (nếu chúng ta cho rằng chúng vẫn còn hữu ích với một chút muối!) .

Trong trường hợp chỉ có cơ sở dữ liệu bị xâm phạm, ngay cả lực lượng vũ phu cũng vô dụng vì kẻ tấn công không tìm kiếm một giá trị (mật khẩu gốc) nhưng cho hai giá trị (mật khẩu gốc VÀ hạt tiêu).

16
Cyril N.

Nếu giá trị băm của bạn không được xử lý, tôi có thể tạo ra toàn bộ giá trị từ điển và lưu trữ chúng trong cơ sở dữ liệu (loại đặc biệt gọi là bảng Rainbow, hiệu quả hơn đối với số lượng lớn giá trị băm), thì tất cả những gì tôi cần làm là tìm kiếm chúng. Về cơ bản một bộ nhớ khổng lồ so với tối ưu hóa thời gian CPU. Ngoài ra, nếu tôi thấy hai người dùng có cùng hàm băm thì tôi biết họ đang sử dụng cùng một mật khẩu.

Muối làm cho mỗi mật khẩu của người dùng băm duy nhất, và nếu bạn làm đúng, nó có thể sẽ là duy nhất ngay cả khi họ sử dụng cùng một mật khẩu trên một số trang web khác (không phổ biến), và vì vậy tôi thực sự sẽ phải dùng Word, áp dụng muối và băm nó, lặp lại cho mục tiếp theo trong từ điển.

8
ewanm89

Băm không được đánh dấu là dễ bị tấn công tra cứu. Có các cơ sở dữ liệu có sẵn miễn phí chứa hàng triệu băm mật khẩu (chủ yếu là MD5 và SHA1) có thể được sử dụng để tra cứu bản rõ của hàm băm. Chúng có thể dựa trên cơ sở dữ liệu quan hệ tiêu chuẩn hoặc trên các định dạng cơ sở dữ liệu chuyên dụng như bảng Rainbow.

Vì vậy, đây là một ví dụ:
[.__.] 7c6a61c68ef8b9b6b061b28c348bc1ed7921cb53 (không ướp muối)
[.__.] 2d67062d67b4d0eaca31a768e901d04982de7352 (được muối với tiền tố "RxB6aE")

Việc tra cứu nhanh trên hàm băm đầu tiên sẽ cho thấy bản rõ là "passw0rd". Tuy nhiên, cái sau không có khả năng được tìm thấy. Trong trường hợp muối không được kẻ tấn công biết đến, nó làm cho các cuộc tấn công từ điển và bruteforce trở nên khó khăn.

Nếu bạn đang tìm cách bảo mật mật khẩu trong cơ sở dữ liệu, bạn nên sử dụng một cái gì đó như bcrypt. Nó sử dụng một số lượng lớn các lần lặp của thuật toán băm để làm cho mỗi phép tính chậm. Như vậy, các cuộc tấn công tàn bạo, tấn công từ điển và xây dựng các bảng Rainbow rất khó khả thi.

6
Polynomial