it-swarm-vi.com

Nên dùng muối gì?

Tôi luôn nghe rằng tốt nhất là sử dụng muối trên đầu trang của mật khẩu được lưu trữ, sau đó bằng cách nào đó sẽ được nối và băm sau đó. Nhưng tôi không biết cái gì để sử dụng như một loại muối. Điều gì sẽ là một muối tốt?

43
Sal

Giả sử bạn có một bảng nơi bạn sẽ lưu mật khẩu cho mỗi người.

Để "lưu" mật khẩu đang được tạo, hãy làm như sau

  1. lấy thông tin đăng nhập từ người dùng
  2. lấy mật khẩu
  3. tạo ra một số muối từ các giá trị ngẫu nhiên. Giả sử, từ/dev/ngẫu nhiên (như @Michal đề xuất), bạn đã nhận được "a12bc34de56fg"
  4. Sử dụng một số chức năng băm để tạo mật khẩu băm. Giả sử mật khẩu ban đầu là "1 mật khẩu" và bạn sẽ sử dụng bất kỳ SHA băm. Bạn sẽ làm

hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg"))))))))))

Lưu trữ hashed_password, với thông tin đăng nhập và muối, trong bảng.

login      password      salt
--------------------------------------
john       a7b82783...   a12bc34de56fg

Và sau đó, để xác minh khi người dùng truy cập ứng dụng của bạn:

  1. lấy thông tin đăng nhập và mật khẩu
  2. lấy muối cho thông tin đăng nhập đó từ cơ sở dữ liệu (bạn sẽ có muối: a12bc34de56fg)
  3. nối mật khẩu văn bản đơn giản với muối và thực hiện lại tất cả quá trình băm:

hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg"))))))))))

Xác minh xem hashed_password mà bạn đã tính có giống với lưu trữ trong cơ sở dữ liệu không. Bạn sẽ biết mật khẩu có đúng hay không.

Đó là nó!. Bạn có thể lấy muối từ bất kỳ nguồn ngẫu nhiên nào bạn muốn. Tại sao nó phải là ngẫu nhiên? Bởi vì bất kỳ loại muối không ngẫu nhiên nào cũng sẽ giúp việc thử vũ trang ứng dụng của bạn dễ dàng hơn nhiều.

13
woliveirajr

Các khuyến nghị cổ điển cho một muối để băm mật khẩu là:

  • A giá trị ngẫu nhiên từ 128 bit trở lên ;
  • thu được từ một trình tạo số ngẫu nhiên âm thanh mật mã ( /dev/random hoặc là /dev/urandom trên Unixes hiện đại);
  • duy nhất cho mỗi mục nhập (tức là không sử dụng lại cùng một loại muối, tạo ra một loại muối mới cho mỗi mật khẩu mới);
  • được lưu trữ trong bản rõ trong cơ sở dữ liệu (để muối có sẵn khi xác minh hàm băm).

Có rất nhiều các cuộc thảo luận trước đây về các chủ đề liên quan . Và quan trọng nhất, bạn nên không thực hiện kế hoạch băm mật khẩu của riêng bạn - bạn nên sử dụng một đã được chứng minh, kiểm tra tốt, thực hiện đánh giá ngang hàng ( bcrypt/PBKDF2) .

30
Jesper M

Câu trả lời là "hầu hết mọi thứ", mặc dù một số mạnh hơn những cái khác.

Giả sử bạn đang sử dụng md5 (salt.password).

Không có muối, tin tặc sẽ nhanh chóng bẻ khóa hầu hết các mật khẩu chỉ bằng cách tra cứu hàm băm trong bảng Rainbow.

Giả sử bạn sử dụng "x" làm muối cho tất cả mật khẩu của mình. Nhiều mật khẩu của bạn sẽ vẫn được tìm thấy, nhưng ít hơn. Đó là bởi vì nếu mật khẩu là "p4ssw0rd", thì nó sẽ trở thành "xp4ssw0rd" với muối - làm cho nó hơi khó hơn, nhưng không đáng kể.

Bây giờ, giả sử bạn sử dụng "% X88Fc + 7" làm muối cho tất cả mật khẩu của mình. Tại thời điểm này, các bảng Rainbow sẽ không hoạt động. Nhưng, hậu quả của việc sử dụng một muối cho tất cả mật khẩu, tin tặc sẽ có thể tạo bảng Rainbow với giả định đó và xây dựng các bảng Rainbow trước thời hạn. Nó an toàn hơn rất nhiều, nhưng không hoàn hảo.

Tùy chọn an toàn nhất tiếp theo là sử dụng tên người dùng làm muối, nói cách khác là sử dụng 'md5 (username.password)'. Một lần nữa, điều này đánh bại bảng Rainbow tiêu chuẩn, nhưng tin tặc có thể tạo bảng Rainbow cho tên người dùng cụ thể (như "root" hoặc "quản trị viên"), để mỗi khi thay đổi mật khẩu, tin tặc có thể tìm kiếm trong Rainbow bảng thay vì bẻ khóa nó một lần nữa.

Vì vậy, để an toàn hơn nữa, hãy chọn một loại muối ngẫu nhiên khác nhau cho những người dùng khác nhau. Bạn phải lưu trữ cái này cùng với tên người dùng và mật khẩu băm. Điều này hoàn toàn đánh bại các bảng Rainbow.

Một số gợi ý một trình tạo số ngẫu nhiên "an toàn", thay vì một cái gì đó đơn giản. Ví dụ: thực hiện MD5 (dấu thời gian + tên người dùng) khi người dùng tạo tài khoản đơn giản, nhưng không bảo mật bằng mật mã (vì dấu thời gian và tên người dùng có thể dự đoán được và do đó entropy thấp). Nhưng, vì dù sao hacker cũng có một bản sao của muối khi anh ta đánh cắp cơ sở dữ liệu, nên đó không phải là vấn đề.

10
Robert David Graham

Đối với muối chỉ cần sử dụng một bit ngẫu nhiên.

Trên Linux, bạn có thể sử dụng /dev/random. Nó là bộ tạo số ngẫu nhiên dựa trên nhiễu môi trường. Nó khá khó đoán ngoại trừ các máy ảo. Vì vậy, nếu bạn cho rằng chuột vật lý được cắm vào hộp của bạn, thì /dev/random Sẽ cung cấp cho bạn các bit ngẫu nhiên chất lượng cao tốt cho muối.

Đây là một tốt bài viết để bắt đầu. Xem thêm các tài liệu tham khảo bên ngoài.

Đây là một ví dụ Java . Xem cách muối được tạo và lưu trữ trong DB trong hàm createUser(). Ngoại trừ việc sử dụng import Sun.misc. ... Đó là một mã rất tốt.

1
Michał Šrajer