Nơi nào bạn lưu trữ chuỗi muối của bạn?


250

Tôi đã luôn sử dụng một chuỗi muối mỗi lần nhập thích hợp khi băm mật khẩu để lưu trữ cơ sở dữ liệu. Đối với nhu cầu của tôi, lưu trữ muối trong DB bên cạnh mật khẩu băm luôn hoạt động tốt.

Tuy nhiên, một số người khuyên rằng muối nên được lưu trữ riêng biệt từ cơ sở dữ liệu. Lập luận của họ là nếu cơ sở dữ liệu bị xâm phạm, kẻ tấn công vẫn có thể xây dựng bảng cầu vồng lấy một chuỗi muối cụ thể để bẻ khóa một tài khoản tại một thời điểm. Nếu tài khoản này có đặc quyền quản trị viên, thì anh ta thậm chí không cần phải bẻ khóa bất kỳ người nào khác.

Từ góc độ an ninh, nó có đáng để lưu trữ muối ở một nơi khác không? Hãy xem xét một ứng dụng web có mã máy chủ và DB trên cùng một máy. Nếu các muối được lưu trữ trong một tệp phẳng trên máy đó, rất có thể là nếu cơ sở dữ liệu bị xâm phạm, thì tệp muối cũng sẽ như vậy.

Có bất kỳ giải pháp được đề nghị cho điều này?


9
Nếu có một nơi mà bạn có thể lưu trữ muối mà kẻ tấn công không thể có được, thì bạn cũng nên lưu trữ mật khẩu ở đó. Nhưng tại sao không sử dụng một loại muối khác nhau cho mỗi mật khẩu?
jrockway

8
Anh ta đang sử dụng một loại muối khác nhau cho mỗi mật khẩu, jrockway.
Amber

9
Muối của bạn lớn bao nhiêu? Muối của bạn phải đủ lớn (32 bit?) Mà thực tế không có khả năng một bảng cầu vồng đã được tính toán trước cho nó.
M. Dudley

@emddudley những ngày này tôi đã có thói quen sử dụng số nguyên 64 bit làm muối, nhưng không có lý do gì tôi không thể làm cho chúng dài hơn.
Friedo

10
Tác giả của PWDTK tại đây sourceforge.net/projects/pwdtknet , thành thật tôi sẽ không lo lắng và tôi sẽ chỉ lưu trữ muối trong cùng một DB như mật khẩu. Bạn nên luôn luôn cho rằng muối được biết đến với kẻ tấn công vì vậy bạn nên tập trung vào việc sử dụng muối LARGE CRYPTO-RANDOM và thực hiện đủ độ căng của phím (lặp trong PBKDF2) để có thể tạo ra ngay cả một bàn cầu vồng cho một muối đã biết. Thành thật mà nói, những gì bạn đang cố gắng đạt được bằng cách đặt muối ở nơi khác là "Bảo mật bằng cách che khuất" và thường không mang lại lợi ích gì khi bạn nhìn vào những thứ như máy chủ khác có khả năng bị hỏng.
thashiznets

Câu trả lời:


259

Điểm quan trọng của các bảng cầu vồng là chúng được tạo trước và phân phối hàng loạt để tiết kiệm thời gian tính toán cho những người khác - chỉ cần tạo ra các bảng cầu vồng một cách nhanh chóng cũng như chỉ cần bẻ khóa trực tiếp mật khẩu + kết hợp muối (kể từ đó có hiệu quả những gì đang được thực hiện khi tạo bảng cầu vồng đang chạy trước các tính toán cho việc băm buộc băm), do đó, lập luận rằng bằng cách biết muối ai đó có thể "tạo ra bảng cầu vồng" là giả mạo.

Không có điểm nào thực sự trong việc lưu trữ muối trong một tệp riêng miễn là chúng dựa trên cơ sở cho mỗi người dùng - điểm của muối chỉ đơn giản là làm cho nó để một bảng cầu vồng không thể phá vỡ mọi mật khẩu trong DB.


17
Đã đồng ý. Mô hình mối đe dọa mà bạn đang bảo vệ bằng cách lưu trữ muối riêng biệt là người dùng bằng cách nào đó có thể truy cập muối trong DB thông qua các phương tiện bất chính, nhưng không phải là hàm băm (trong DB). Và người đó sẽ bắt đầu tính toán một bảng cầu vồng trước, giả sử anh ta sẽ có thể tìm thấy hàm băm sau đó. Không phải là không thể, nhưng cũng không xứng đáng với nỗ lực kỹ thuật để bảo vệ trong đại lộ tấn công duy nhất này.
Tom Ritter

Bài đăng đẹp, tôi đã tự hỏi điều tương tự. Tôi chưa bao giờ nghĩ về một loại muối cho mỗi người dùng Tôi đã nghĩ rằng một loại muối duy nhất sẽ hoạt động cho tất cả người dùng. Còn một muối được lưu trữ dưới dạng tệp XML được App Server tải thì sao? hoặc có thể bằng cách nào đó mã hóa cứng thành một servlet?
jigzat

9
@Jigzat - Salting là vô nghĩa nếu bạn không có một loại muối riêng cho mỗi người dùng. Điểm quan trọng của muối là làm cho việc băm băm trở thành một nhiệm vụ riêng cho mỗi mật khẩu người dùng; nếu muối giống nhau cho tất cả chúng thì không phải vậy.
Amber

3
@TomRitter đó không phải là trường hợp duy nhất. bạn cho rằng tất cả các mật khẩu đều phức tạp. một số kẻ tấn công có thể lấy muối và băm và chỉ kiểm tra 10.000 mật khẩu phổ biến nhất. bằng cách đó họ sẽ có được một số lượng người. tuy nhiên, nếu họ không có quyền truy cập vào muối, điều đó gần giống với việc người dùng có mật khẩu an toàn lâu hơn. bây giờ, có khả năng cơ sở dữ liệu muối sẽ an toàn trong khi cơ sở dữ liệu mật khẩu bị đánh cắp là điều cần tranh luận, nhưng đó là một vấn đề riêng biệt.
chacham15

@Amber, tôi tin TomRitter là chính xác. Lưu trữ muối riêng biệt có nghĩa là sự khác biệt giữa việc buộc kẻ tấn công sử dụng một cuộc tấn công vũ phu so với một cuộc tấn công từ điển dễ dàng hơn. Nếu bạn biết muối, bạn chỉ có thể nối nó trong một cuộc tấn công từ điển mill. Nếu bạn có thể bảo vệ 100% muối của mình, bạn chỉ cần sử dụng cùng loại muối và buộc những kẻ tấn công để vũ trang mọi thứ (ngay cả đối với người dùng sử dụng "mật khẩu" làm mật khẩu của họ). Nhưng bạn có thể bảo vệ muối của bạn .... có thể không. Vì vậy, cũng có thể giảm các điểm thất bại bằng cách lưu trữ nó bên cạnh hàm băm và thực thi các quy tắc mật khẩu mạnh hơn.
Ultratrunks

35

Tôi sẽ cung cấp một chút khác nhau về điều này.

Tôi luôn lưu trữ muối trộn với hàm băm mật khẩu muối.

Ví dụ, tôi sẽ đặt nửa đầu của muối trước hàm băm của mật khẩu và nửa cuối của muối sau hàm băm của mật khẩu. Ứng dụng nhận thức được thiết kế này vì vậy có thể lấy dữ liệu này và lấy băm mật khẩu muối và muối.

Lý do của tôi cho phương pháp này:

Nếu mật khẩu / dữ liệu băm bị xâm phạm và rơi vào tay kẻ tấn công, kẻ tấn công sẽ không biết muối là gì khi nhìn vào dữ liệu. Bằng cách này, kẻ tấn công thực tế không thể thực hiện một cuộc tấn công vũ phu để có được mật khẩu khớp với hàm băm, vì anh ta không biết bắt đầu băm và không có cách nào để biết phần nào của dữ liệu là một phần của muối, hoặc các phần của hàm băm mật khẩu muối ( trừ khi anh ta biết logic xác thực của ứng dụng của bạn ).

Nếu hàm băm mật khẩu muối được lưu trữ nguyên trạng, thì một cuộc tấn công vũ phu có thể được thực hiện để lấy mật khẩu mà khi băm và băm tạo ra dữ liệu giống như băm mật khẩu muối.

Tuy nhiên, ví dụ, ngay cả khi hàm băm mật khẩu đã được lưu trữ nguyên trạng, nhưng được sử dụng trước một byte ngẫu nhiên, miễn là kẻ tấn công không biết rằng byte đầu tiên này sẽ bị loại bỏ, điều này cũng sẽ làm tăng độ khó tấn công. Ứng dụng của bạn sẽ biết loại bỏ byte đầu tiên của dữ liệu khi được sử dụng để xác thực người dùng của bạn.

Kết luận cho điều này ..

1) Không bao giờ lưu trữ dữ liệu mà ứng dụng xác thực của bạn sử dụng ở dạng chính xác.

2) Nếu có thể, hãy giữ bí mật logic xác thực của bạn để tăng cường bảo mật.

Đi thêm một bước nữa ..

Nếu bạn không thể giữ bí mật logic xác thực của ứng dụng - nhiều người biết cách dữ liệu của bạn được lưu trữ trong cơ sở dữ liệu. Và giả sử bạn đã quyết định lưu trữ băm mật khẩu muối trộn cùng với muối, với một số muối chuẩn bị băm mật khẩu muối và phần còn lại của muối gắn nó.

Khi tạo muối ngẫu nhiên, bạn cũng có thể quyết định ngẫu nhiên tỷ lệ muối bạn sẽ lưu trữ trước / sau hàm băm mật khẩu muối.

Ví dụ: bạn tạo một muối ngẫu nhiên 512 byte. Bạn nối muối vào mật khẩu của mình và lấy hàm băm SHA-512 của mật khẩu đã được muối. Bạn cũng tạo ra một số nguyên ngẫu nhiên 200. Sau đó, bạn lưu trữ 200 byte muối đầu tiên, theo sau là hàm băm mật khẩu muối, tiếp theo là phần còn lại của muối.

Khi xác thực nhập mật khẩu của người dùng, ứng dụng của bạn sẽ chuyển qua chuỗi và giả sử 1 byte đầu tiên của dữ liệu là 1 byte đầu tiên của muối, tiếp theo là hàm băm. Vượt qua này sẽ thất bại. Ứng dụng sẽ tiếp tục bằng cách sử dụng 2 byte đầu tiên của dữ liệu làm 2 byte đầu tiên của muối và lặp lại cho đến khi tìm thấy kết quả dương tính sau khi sử dụng 200 byte đầu tiên làm 200 byte đầu tiên của muối. Nếu mật khẩu sai, ứng dụng sẽ tiếp tục thử tất cả các hoán vị cho đến khi không tìm thấy.

Ưu điểm của phương pháp này:

Tăng tính bảo mật - ngay cả khi logic xác thực của bạn được biết đến, logic chính xác không xác định tại thời điểm biên dịch. Thực tế không thể thực hiện một cuộc tấn công vũ phu, ngay cả với kiến ​​thức về logic chính xác. Độ dài của muối sẽ tăng thêm an ninh.

Nhược điểm của phương pháp này:

Vì logic chính xác được suy luận trong thời gian chạy, nên cách tiếp cận này rất tốn CPU. Độ dài của muối càng dài, phương pháp này càng tốn nhiều CPU.

Xác thực mật khẩu không chính xác sẽ liên quan đến chi phí CPU cao nhất. Điều này có thể phản tác dụng đối với các yêu cầu hợp pháp, nhưng tăng cường bảo mật chống lại những kẻ tấn công.

Cách tiếp cận này có thể được thực hiện theo nhiều cách khác nhau và có thể được thực hiện an toàn hơn nữa bằng cách sử dụng muối có độ rộng thay đổi và / hoặc băm mật khẩu muối.


9
Với cách tiếp cận của bạn, bạn chỉ cần thêm một bí mật vào quá trình băm của mình (thuật toán áp dụng muối). Bí quyết này bạn có thể thêm dễ dàng hơn nhiều bằng cách thêm hạt tiêu vào muối, tôi đã cố gắng chỉ ra điều này trong hướng dẫn của tôi . Các hàm băm hiện đại như BCrypt sẽ tự áp dụng muối, sử dụng muối ban đầu trong mỗi lần lặp, do đó bạn sẽ không kiểm soát được việc này.
martinstoeckli

@martinstoeckli Mặc dù bạn đúng rằng BCrypt tự áp dụng muối, việc lưu trữ muối + băm đó tùy thuộc vào bạn là nhà phát triển. Vì vậy, bạn có thể dễ dàng thêm hạt tiêu vào muối + băm và duy trì nó vào cơ sở dữ liệu. Sau đó, trong lần truy xuất tiếp theo, bạn đọc giá trị từ cơ sở dữ liệu, tước giá trị tiêu và chuyển giá trị còn lại cho BCrypt.
PeterToTheThứ ba

2
@PeterToTheThird - Điều này sẽ phủ nhận lợi thế của hạt tiêu. Hạt tiêu thêm một bí mật phía máy chủ, và chỉ hoạt động miễn là nó giữ bí mật (đối diện với muối). Một cuộc tấn công điển hình là SQL-tiêm, khi ai đó có quyền truy cập vào cơ sở dữ liệu nhưng không truy cập vào mã, một hạt tiêu được lưu trữ trong cơ sở dữ liệu sẽ vô dụng sau đó. Hầu hết các triển khai BCrypt sẽ tự động thêm muối vào giá trị băm kết quả, vì vậy giá trị này đã chứa muối, hệ số chi phí, thuật toán và hàm băm. Chuỗi này có thể được lưu trữ trong một trường có độ dài 60 ký tự.
martinstoeckli

Ngoài ra, khi sử dụng chức năng "tăng cường khóa" như BCrypt, bạn không có quyền kiểm soát việc sử dụng muối. Tuy nhiên, nếu bạn muốn sử dụng hạt tiêu, bạn chỉ cần thêm hạt tiêu vào muối và sử dụng nó làm "muối tiêu" thay cho đầu vào "muối" vào chức năng băm. "Hạt tiêu" sau đó là một phần dữ liệu phù hợp không được lưu trữ trong cơ sở dữ liệu, nhưng được nhúng trong mã xác thực hoặc được lưu trữ ở một vị trí an toàn khác. Tôi đã tiếp cận vấn đề từ góc độ chung, sử dụng SHA-512 làm chức năng ví dụ, nhưng BCrypt, v.v. cũng có thể được sử dụng theo cách tương tự.
Ibraheem

2
@martinstoeckli - vâng, việc triển khai thực tế phụ thuộc vào chức năng băm bạn sử dụng. Rõ ràng bạn cần xem xét các tham số và đầu ra của hàm băm khi triển khai logic xác thực của mình. Cuối cùng, một hạt tiêu chỉ là một biến khác được đưa vào chức năng băm của bạn, không được lưu trữ ở cùng vị trí với muối và hàm băm.
Ibraheem

23

Thông thường, chúng được thêm vào hàm băm và được lưu trữ trong cùng một trường.

Không cần lưu trữ chúng một cách riêng biệt - vấn đề là sử dụng một loại muối ngẫu nhiên cho mỗi mật khẩu để một bảng cầu vồng duy nhất không thể được sử dụng đối với toàn bộ bộ băm mật khẩu của bạn. Với các muối ngẫu nhiên, kẻ tấn công phải vũ phu tách riêng từng hàm băm (hoặc tính một bảng cầu vồng cho tất cả các muối có thể - nhiều công việc hơn).

Nếu bạn có một vị trí lưu trữ an toàn hơn, sẽ rất hợp lý nếu chỉ lưu trữ các giá trị băm ở đó.


4
Nhưng điều gì xảy ra nếu tất cả các mật khẩu băm bị rò rỉ bao gồm cả muối phù hợp của chúng? Đó không phải là không an toàn sao?
mghaoui

10
@mghaoui Nhưng sau đó, nếu bạn muốn biết "mật khẩu", bạn vẫn sẽ phải xây dựng Bảng cầu vồng cho mỗi muối, trừ khi một số muối giống nhau.
Franklin

4

Dựa trên cuốn sách Phát triển ứng dụng web ASP.NET MVC 4 của William Penberthy:

  1. Truy cập vào các muối được lưu trữ trong một cơ sở dữ liệu riêng biệt yêu cầu tin tặc hack hai cơ sở dữ liệu khác nhau để có quyền truy cập vào muối và mật khẩu muối. Lưu trữ chúng trong cùng một bảng với mật khẩu hoặc thậm chí một bảng khác của cùng một cơ sở dữ liệu, có nghĩa là khi tin tặc có quyền truy cập vào cơ sở dữ liệu, chúng sẽ có quyền truy cập vào cả hàm băm và mật khẩu. Bởi vì bảo mật bao gồm quá trình hack vào hệ thống quá tốn kém hoặc tốn thời gian để có giá trị, nên việc nhân đôi số lượng truy cập mà hacker phải có sẽ giúp hệ thống an toàn hơn.
  2. Dễ sử dụng là lý do chính để giữ muối trong cùng một cơ sở dữ liệu như mật khẩu băm. Bạn sẽ không phải đảm bảo rằng hai cơ sở dữ liệu luôn có sẵn cùng một lúc và luôn đồng bộ. Lợi thế của việc có muối là tối thiểu nếu mỗi người dùng có một loại muối ngẫu nhiên bởi vì mặc dù điều đó có thể giúp việc khám phá mật khẩu của một cá nhân dễ dàng hơn, lượng lực cần thiết để bẻ khóa mật khẩu của toàn bộ hệ thống sẽ rất cao. Trong cấp độ thảo luận này, đó thực sự là những gì mong đợi: bảo vệ mật khẩu. Nếu tin tặc đã có được một bản sao của cơ sở dữ liệu, dữ liệu ứng dụng của bạn đã bị xâm phạm. Tại thời điểm này, vấn đề là giảm thiểu rủi ro của người dùng vì tiềm năng của mật khẩu được chia sẻ.
  3. Yêu cầu duy trì hai cơ sở dữ liệu được liên kết riêng biệt là rộng lớn. Cấp, nó thêm nhận thức về bảo mật, nhưng lợi thế duy nhất mà nó mang lại là nó bảo vệ một mật khẩu, một yếu tố duy nhất của dữ liệu. Nếu mọi trường trong cơ sở dữ liệu được mã hóa riêng lẻ và cùng loại muối này được sử dụng cho điều đó, sẽ có ý nghĩa hơn khi lưu trữ riêng biệt với dữ liệu vì bảo mật cơ bản của hệ thống của bạn được tăng cường.

Nếu ứng dụng có thể xác thực cho cả hai cơ sở dữ liệu, thì về cơ bản nó không giống như một cơ sở dữ liệu, nếu kẻ tấn công đã xâm phạm mã ứng dụng?
John Ernest

0

Điểm quan trọng của muối là làm cho tất cả các bảng cầu vồng trở nên vô dụng và yêu cầu một bộ mới để tạo ra chúng. Chỉ mất một thời gian để đoán một chuỗi như để tạo ra một bảng cầu vồng. Ví dụ, hàm băm "mật khẩu" SHA-256 là 5e88 4898 da28 0471 51d0 e56f 8dc6 2927 7360 3d0d 6aab bdd6 2a11 ef72 1d15 42d8. Sau khi một muối được thêm vào, chẳng hạn như "badpassword", chuỗi mới được băm là "passwordbadpassword", do hiệu ứng tuyết lở, thay đổi đáng kể đầu ra, thành457b f8b5 37f1 802e f9c8 2e46 b8d3 f8b5 721b 7cbb d485 f0bb e523 bfbe 73e6 58d6 .

Thông thường, muối chỉ được lưu trữ trong cùng một cơ sở dữ liệu với mật khẩu, bởi vì nếu một cơ sở dữ liệu bị hack, có khả năng là cơ sở dữ liệu kia cũng sẽ như vậy.

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.