Sự cần thiết của việc ẩn muối cho một hàm băm


99

Tại nơi làm việc, chúng tôi có hai lý thuyết cạnh tranh về muối. Các sản phẩm tôi đang làm việc sử dụng một cái gì đó như tên người dùng hoặc số điện thoại để muối băm. Về cơ bản, một cái gì đó khác nhau đối với mỗi người dùng nhưng luôn có sẵn cho chúng tôi. Sản phẩm còn lại tạo ngẫu nhiên một muối cho mỗi người dùng và thay đổi mỗi khi người dùng thay đổi mật khẩu. Muối sau đó được mã hóa trong cơ sở dữ liệu.

Câu hỏi của tôi là nếu cách tiếp cận thứ hai có thực sự cần thiết? Tôi có thể hiểu từ góc độ lý thuyết thuần túy rằng nó an toàn hơn cách tiếp cận đầu tiên, nhưng từ quan điểm thực tế thì sao. Ngay bây giờ để xác thực người dùng, muối phải không được mã hóa và áp dụng cho thông tin đăng nhập.

Sau khi suy nghĩ về nó, tôi chỉ không thấy lợi ích bảo mật thực sự từ cách tiếp cận này. Việc thay đổi muối từ tài khoản này sang tài khoản khác, vẫn khiến ai đó cực kỳ khó khăn khi cố gắng thực hiện thuật toán băm ngay cả khi kẻ tấn công biết cách nhanh chóng xác định nó là gì cho mỗi tài khoản. Điều này xảy ra với giả định rằng mật khẩu đủ mạnh. (Rõ ràng việc tìm kiếm hàm băm chính xác cho một bộ mật khẩu có tất cả hai chữ số sẽ dễ dàng hơn đáng kể so với việc tìm hàm băm chính xác của mật khẩu có 8 chữ số). Tôi có sai trong logic của mình, hay có điều gì đó mà tôi đang thiếu?

EDIT: Được rồi, vì vậy đây là lý do tại sao tôi nghĩ rằng việc mã hóa muối thực sự là một cuộc tranh luận. (lemme biết nếu tôi đang đi đúng hướng).

Đối với lời giải thích sau đây, chúng tôi sẽ giả định rằng mật khẩu luôn có 8 ký tự và muối là 5 và tất cả mật khẩu đều bao gồm các chữ cái viết thường (nó chỉ làm cho phép toán dễ dàng hơn).

Có một loại muối khác nhau cho mỗi mục nhập có nghĩa là tôi không thể sử dụng cùng một bảng cầu vồng (thực sự về mặt kỹ thuật, tôi có thể làm được nếu tôi có một kích thước đủ lớn, nhưng hãy bỏ qua điều đó vào lúc này). Đây là chìa khóa thực sự cho muối từ những gì tôi hiểu, bởi vì để bẻ khóa mọi tài khoản, tôi phải phát minh lại bánh xe để nói cho từng tài khoản. Bây giờ nếu tôi biết cách áp dụng muối chính xác cho mật khẩu để tạo hàm băm, tôi sẽ làm điều đó vì một muối thực sự chỉ mở rộng độ dài / độ phức tạp của cụm từ được băm. Vì vậy, tôi sẽ cắt số lượng các kết hợp có thể mà tôi sẽ cần tạo để "biết" tôi có mật khẩu + muối từ 13 ^ 26 đến 8 ^ 26 vì tôi biết muối là gì. Bây giờ điều đó làm cho nó dễ dàng hơn, nhưng vẫn thực sự khó.

Vì vậy, hãy mã hóa muối. Nếu tôi biết muối được mã hóa, tôi sẽ không thử và giải mã (giả sử tôi biết nó có đủ mức mã hóa) nó trước. Tôi sẽ bỏ qua nó. Thay vì cố gắng tìm ra cách giải mã nó, quay lại ví dụ trước, tôi sẽ chỉ tạo một bảng cầu vồng lớn hơn chứa tất cả các khóa cho 13 ^ 26. Không biết muối chắc chắn sẽ làm tôi chậm lại, nhưng tôi không nghĩ nó sẽ thêm nhiệm vụ hoành tráng là cố gắng bẻ khóa mã hóa muối trước. Đó là lý do tại sao tôi không nghĩ nó đáng giá. Suy nghĩ?

Đây là liên kết mô tả mật khẩu sẽ giữ được bao lâu khi bị tấn công vũ phu: http://www.lockdown.co.uk/?pg=combi


Câu hỏi hay, Kevin, rất đúng lúc. Tôi không thể bình luận về bảo mật, nhưng chắc chắn có một hiệu suất cho tất cả quá trình mã hóa và giải mã này.
DOK

Bạn không cần phải bỏ qua bảng cầu vồng có kích thước phù hợp - bảng đó cũng tạo ra cuộc tranh luận về muối được mã hóa vì nó có thể giải mã hàm băm muối và được sử dụng lại để giải mã hàm băm ban đầu. Tin tốt là chiếc bàn đó có lẽ sẽ mất hàng thế kỷ để tạo ra.
tloach 17/10/08

Điều khiến tôi chú ý là tôi không hoàn toàn chắc chắn rằng một bảng cầu vồng có kích thước như vậy sẽ mất nhiều thời gian để tạo ra. Anh ta là một người có ý tưởng kỳ quặc, sử dụng một nền tảng máy tính phân tán như Kraken (thực sự là như vậy) để tạo ra nó. Sau đó sẽ mất bao lâu?
kemiller2002 17/10/08

3
@Kevin: SHA1 trả về một chuỗi hex gồm 40 ký tự, vì vậy có thể có 40 ^ 16 giá trị trả về. Giả sử một máy tính duy nhất có thể tính toán 1000 băm mỗi giây, tôi tính toán 1 000 000 máy tính sẽ mất khoảng 10 tỷ năm để tạo ra một bảng cầu vồng có khả năng xác định một chuỗi có kích thước như vậy.
tloach 18/10/08

+1 câu hỏi hay và bạn cũng đã đọc. Tôi nghĩ rằng bạn đã trả lời sai cho câu hỏi này. Nên luôn luôn là một bí mật bởi vì băm không thể bị phá vỡ cho đến khi nó được lấy. Bạn nên đọc về CWE-760 ( cwe.mitre.org/data/definitions/760.html )
rook

Câu trả lời:


45

Câu trả lời ở đây là hãy tự hỏi bản thân rằng bạn đang thực sự cố gắng bảo vệ điều gì? Nếu ai đó có quyền truy cập vào cơ sở dữ liệu của bạn, thì họ có quyền truy cập vào các muối được mã hóa và có thể họ cũng có quyền truy cập vào mã của bạn. Với tất cả những gì họ có thể giải mã các muối được mã hóa? Nếu vậy thì dù sao thì mã hóa cũng vô dụng. Muối thực sự ở đó để tạo ra nó vì vậy không thể tạo một bảng cầu vồng để bẻ khóa toàn bộ cơ sở dữ liệu mật khẩu của bạn trong một lần nếu nó bị xâm nhập. Theo quan điểm đó, miễn là mỗi muối là duy nhất không có sự khác biệt, thì một cuộc tấn công bạo lực sẽ được yêu cầu với các muối của bạn hoặc các muối được mã hóa cho từng mật khẩu riêng lẻ.


Kinda mới đối với những khái niệm này. Vì vậy, nó có thể trông giống như một câu hỏi ngây thơ nhưng sẽ không dễ dàng hơn để hình thành bảng cầu vồng đó với việc biết muối cho mỗi mật khẩu khi bạn chỉ thử một kết hợp cho giá trị muối cho mọi mật khẩu có thể?
stdout

bảng ranbow từ ví dụ 1000 mật khẩu thường được sử dụng sẽ phá vỡ điều này với tốc độ gần giống như chỉ băm. Cách duy nhất điều này sẽ hoạt động là nếu bạn giả định việc phân phối mật khẩu của mình là đồng nhất .. và chúng tôi biết chúng không giống như vậy
DaWNFoRCe 22/11/19

100

Việc giấu muối là không cần thiết.

Một muối khác nên được sử dụng cho mỗi băm. Trong thực tế, điều này dễ dàng đạt được bằng cách lấy 8 byte trở lên từ trình tạo số ngẫu nhiên chất lượng mật mã.

Từ một câu trả lời trước đây của tôi :

Salt giúp ngăn chặn các cuộc tấn công từ điển được tính toán trước.

Giả sử kẻ tấn công có một danh sách các mật khẩu có thể xảy ra. Anh ta có thể băm mỗi thứ và so sánh nó với mật khẩu của nạn nhân, và xem nó có khớp không. Nếu danh sách lớn, việc này có thể mất nhiều thời gian. Anh ta không muốn dành nhiều thời gian như vậy cho mục tiêu tiếp theo của mình, vì vậy anh ta ghi lại kết quả trong một "từ điển" nơi một hàm băm trỏ đến đầu vào tương ứng của nó. Nếu danh sách mật khẩu rất rất dài, anh ta có thể sử dụng các kỹ thuật như Bảng Cầu vồng để tiết kiệm một số không gian.

Tuy nhiên, giả sử mục tiêu tiếp theo của anh ta làm mặn mật khẩu của họ. Ngay cả khi kẻ tấn công biết muối là gì, bảng tính toán trước của hắn cũng vô giá trị - muối thay đổi hàm băm từ mỗi mật khẩu. Anh ta phải băm lại tất cả mật khẩu trong danh sách của mình, gắn muối của mục tiêu vào đầu vào. Mỗi muối khác nhau yêu cầu một từ điển khác nhau và nếu sử dụng đủ muối, kẻ tấn công sẽ không có chỗ để lưu trữ từ điển cho tất cả chúng. Không gian giao dịch để tiết kiệm thời gian không còn là một lựa chọn; kẻ tấn công phải quay lại băm từng mật khẩu trong danh sách của mình cho mỗi mục tiêu mà hắn muốn tấn công.

Vì vậy, không cần thiết phải giữ bí mật về muối. Đảm bảo rằng kẻ tấn công không có từ điển được tính toán trước tương ứng với muối cụ thể đó là đủ.


Sau khi suy nghĩ về điều này một chút, tôi nhận ra rằng việc đánh lừa bản thân nghĩ rằng muối có thể được che giấu là rất nguy hiểm. Tốt hơn hết là bạn nên cho rằng không thể giấu muối và thiết kế hệ thống để an toàn mặc dù vậy. Tôi cung cấp một lời giải thích chi tiết hơn trong một câu trả lời khác.


Tuy nhiên, các khuyến nghị gần đây từ NIST khuyến khích sử dụng thêm một loại "muối" bí mật (tôi đã thấy những người khác gọi bí mật này là "hạt tiêu"). Có thể thực hiện thêm một lần lặp lại dẫn xuất khóa bằng cách sử dụng bí mật này dưới dạng muối. Thay vì tăng cường sức mạnh chống lại một cuộc tấn công tra cứu được tính toán trước, vòng này bảo vệ chống lại việc đoán mật khẩu, giống như số lượng lớn các lần lặp lại trong một hàm dẫn xuất khóa tốt. Bí mật này không có mục đích gì nếu được lưu trữ bằng mật khẩu băm; nó phải được quản lý như một bí mật và điều đó có thể khó khăn trong một cơ sở dữ liệu người dùng lớn.


1
Việc giấu muối là cần thiết vì băm không thể bị phá vỡ cho đến khi thu được. Điều này liên quan đến CWE-760 ( cwe.mitre.org/data/definitions/760.html )
rook

28
@ The Rook - Không, bạn đang hiểu sai vấn đề đó. Nó đề cập đến việc sử dụng các loại muối có thể dự đoán được. Nó không nói gì về việc giữ bí mật về muối. Thật vậy, bạn thực sự không thể giữ bí mật về muối mà không sử dụng bí mật khác ... trong trường hợp đó, tại sao bạn không sử dụng bí mật thứ hai là muối? Sử dụng tên người dùng làm muối là không tốt vì nhiều hệ thống có cùng tên người dùng, điều này khiến việc xây dựng một bảng cho muối cụ thể đó trở nên đáng giá hơn. Các loại muối ngẫu nhiên là tốt nhất, nhưng chúng không cần phải giữ bí mật.
erickson


1
@erickson, tôi nghĩ rằng bạn đang trộn lẫn thuật ngữ ở đây. Salts không cản trở các cuộc tấn công từ điển trừ khi chúng bị ẩn. Rất nhiều muối được lưu trữ công khai. Và nếu bạn biết muối, cuộc tấn công từ điển của bạn chỉ bị chậm lại theo thời gian cần thiết để thêm muối vào thuật ngữ từ điển của bạn :) Salts ngăn tra cứu bảng Cầu vồng .... khá nhanh. Nếu kẻ tấn công biết muối của bạn, bạn không được bảo vệ khỏi cuộc tấn công từ điển. Nếu kẻ tấn công không biết muối của bạn, bạn sẽ được bảo vệ khỏi một cuộc tấn công từ điển và chúng phải sử dụng một cuộc tấn công vũ phu.
Ultratrunks

4
@Ultratrunks Có, tôi đã làm rõ một số câu trả lời của mình về chủ đề này, bằng cách sử dụng thuật ngữ "tấn công từ điển được tính toán trước". Tổng quát hơn bảng Rainbow, nó đề cập đến bất kỳ cấu trúc nào cho phép tra cứu ngược lại một bản rõ bằng cách sử dụng hàm băm của nó làm khóa. Bất kể thuật ngữ bạn chọn là gì, tôi giải thích rõ ràng rằng muối nhằm đánh bại bảng Cầu vồng và các cơ chế tương tự. Bạn nên luôn cho rằng kẻ tấn công biết muối. Nếu có thể giữ bí mật, bạn sẽ không cần phải băm mật khẩu.
erickson

3

Sự hiểu biết của tôi về "muối" là nó làm cho việc bẻ khóa khó khăn hơn, nhưng nó không cố gắng che giấu dữ liệu bổ sung. Nếu bạn đang cố gắng tăng cường bảo mật bằng cách đặt muối "bí mật", thì bạn thực sự chỉ muốn có thêm bit trong khóa mã hóa của mình.


3

Cách tiếp cận thứ hai chỉ an toàn hơn một chút. Salts bảo vệ người dùng khỏi các cuộc tấn công từ điển và các cuộc tấn công bảng cầu vồng. Chúng khiến kẻ tấn công tham vọng khó xâm nhập toàn bộ hệ thống của bạn hơn, nhưng vẫn dễ bị tấn công tập trung vào một người dùng trong hệ thống của bạn. Nếu bạn sử dụng thông tin có sẵn công khai, chẳng hạn như số điện thoại và kẻ tấn công biết được điều này , thì bạn đã tiết kiệm cho chúng một bước trong cuộc tấn công của chúng. Tất nhiên câu hỏi là tranh luận nếu kẻ tấn công lấy được toàn bộ cơ sở dữ liệu, muối và tất cả của bạn.

CHỈNH SỬA: Sau khi đọc lại câu trả lời này và một số nhận xét, tôi nhận ra rằng một số nhầm lẫn có thể là do thực tế là tôi chỉ so sánh hai trường hợp rất cụ thể được trình bày trong câu hỏi: muối ngẫu nhiên vs. muối không ngẫu nhiên. Câu hỏi về việc sử dụng một số điện thoại như một muối sẽ được tranh luận nếu kẻ tấn công lấy được toàn bộ cơ sở dữ liệu của bạn, chứ không phải câu hỏi về việc sử dụng một muối nào cả.


Làm thế nào để họ bảo vệ khỏi các cuộc tấn công từ điển?
tloach 17/10/08

Bằng cách buộc kẻ tấn công tạo một từ điển mới cho mỗi kết hợp mật khẩu + muối. Nếu không có muối, một từ điển có thể được sử dụng đối với toàn bộ bảng mật khẩu của bạn.
Bill the Lizard

"Tất nhiên câu hỏi là tranh luận nếu kẻ tấn công lấy được toàn bộ cơ sở dữ liệu, muối và tất cả của bạn." Đó không phải là lý do tại sao muối được mã hóa?
Patrick McElhaney 17/10/08

1
@Bill: Bạn vừa mô tả một bảng cầu vồng. Tấn công từ điển là nơi tôi lấy những từ bình thường và cố gắng xác thực chúng. Đó là một vũ phu với không gian câu trả lời bị giảm đáng kể. Không có hàm băm nào chống lại bạo lực.
tloach 17/10/08

Tôi chưa bao giờ nghe nói về phương pháp này, nhưng tôi không phải là chuyên gia bảo mật. Có vẻ như việc mã hóa các muối duy nhất sẽ thêm một lớp bảo vệ chống lại các cuộc tấn công bảng cầu vồng.
Bill the Lizard

3

... một cái gì đó như tên người dùng hoặc số điện thoại để muối băm. ...

Câu hỏi của tôi là nếu cách tiếp cận thứ hai có thực sự cần thiết? Tôi có thể hiểu từ góc độ lý thuyết thuần túy rằng nó an toàn hơn so với cách tiếp cận đầu tiên, nhưng từ quan điểm thực tế thì sao?

Từ quan điểm thực tế, một muối là một chi tiết thực hiện. Nếu bạn từng thay đổi cách thu thập hoặc duy trì thông tin người dùng - và cả tên người dùng và số điện thoại đôi khi thay đổi, để sử dụng các ví dụ chính xác của bạn - thì bạn có thể đã xâm phạm tính bảo mật của mình. Bạn có muốn một sự thay đổi bề ngoài như vậy có những lo ngại sâu sắc hơn về bảo mật không?

Việc dừng yêu cầu mỗi tài khoản có một số điện thoại có cần phải tiến hành xem xét bảo mật hoàn chỉnh để đảm bảo rằng bạn không mở các tài khoản đó theo một thỏa hiệp bảo mật không?


2
Chưa kể nếu bạn đang sử dụng một số thông tin người dùng tùy ý, khi họ thay đổi thông tin đó, bạn cần họ nhập lại mật khẩu của họ để bạn có thể mã hóa lại bằng muối mới.
Treborbob,

3

Một muối ẩn không còn là muối. Đó là hạt tiêu. Nó có công dụng của nó. Nó khác với muối.

Pepper là một khóa bí mật được thêm vào mật khẩu + muối để băm thành HMAC (Mã xác thực tin nhắn dựa trên băm). Một tin tặc có quyền truy cập vào đầu ra băm và muối về mặt lý thuyết có thể brute force đoán đầu vào sẽ tạo ra băm (và do đó vượt qua xác thực trong hộp văn bản mật khẩu). Bằng cách thêm hạt tiêu, bạn sẽ tăng không gian vấn đề theo cách mật mã ngẫu nhiên, làm cho vấn đề trở nên khó chữa mà không cần phần cứng nghiêm trọng.

Để biết thêm thông tin về hạt tiêu, hãy xem tại đây .

Xem thêm hmac .


2

Đây là một ví dụ đơn giản cho thấy lý do tại sao lại tệ khi có cùng một lượng muối cho mỗi hàm băm

Hãy xem xét bảng sau

UserId  UserName,   Password
     1  Fred       Hash1 =  Sha(Salt1+Password1)    
     2  Ted        Hash2 =  Sha(Salt2+Password2)    

Trường hợp 1 khi muối 1 giống với salt2 Nếu Hash2 được thay thế bằng Hash1 thì người dùng 2 có thể đăng nhập bằng mật khẩu của người dùng 1

Trường hợp 2 khi muối 1 không giống muối2 Nếu thay thế Hash2 bằng Hash1 thì user2 không thể đăng nhập bằng mật khẩu của người dùng 1.


Chúng tôi không sử dụng cùng một hàm băm cho mỗi tài khoản, chúng tôi đang sử dụng cùng một loại thông tin cho mỗi hàm băm. Ví dụ: muối cho một tài khoản là số điện thoại của tài khoản, v.v.
kemiller2002

Tôi biết điều này là rất lâu sau đó, nhưng ... bạn không thể dựa vào muối để bảo vệ khỏi loại tấn công này. Chúng ta phải cho rằng kẻ tấn công biết mọi thứ về hệ thống xác thực ngoài bí mật (tức là mật khẩu). Do đó, chúng ta phải giả định rằng kẻ tấn công biết a) những gì chúng ta đang sử dụng làm muối (hầu hết các lần điều này được lưu trữ trong cùng một cơ sở dữ liệu & bảng ở bản rõ) và b) cách chúng ta băm với muối (tức là thêm vào, băm hai lần, Vân vân). Nếu người dùng có khả năng chuyển đổi hàm băm thì chúng ta phải giả sử rằng họ cũng có thể chuyển đổi muối. Muối sẽ không giúp được gì ở đây.
Dave Satch

1

Có hai kỹ thuật, với các mục tiêu khác nhau:

  • "Muối" được sử dụng để làm cho hai mật khẩu bằng nhau được mã hóa khác nhau. Bằng cách này, kẻ xâm nhập không thể sử dụng hiệu quả một cuộc tấn công từ điển chống lại toàn bộ danh sách mật khẩu được mã hóa.

  • "Bí mật" (được chia sẻ) được thêm vào trước khi băm một tin nhắn, để kẻ xâm nhập không thể tạo tin nhắn của riêng mình và đã chấp nhận chúng.


0

Tôi có xu hướng giấu muối. Tôi sử dụng 10 bit muối bằng cách thêm một số ngẫu nhiên từ 1 đến 1024 vào đầu mật khẩu trước khi băm nó. Khi so sánh mật khẩu mà người dùng đã nhập với hàm băm, tôi lặp lại từ 1 đến 1024 và thử mọi giá trị có thể có của muối cho đến khi tôi tìm thấy kết quả khớp. Quá trình này mất chưa đến 1/10 giây. Tôi có ý tưởng làm theo cách này từ PHP password_hashpassword_verify . Trong ví dụ của tôi, "giá" là 10 cho 10 bit muối. Hoặc từ những gì một người dùng khác nói, "muối" ẩn được gọi là "tiêu". Muối không được mã hóa trong cơ sở dữ liệu. Nó vũ phu bị ép buộc. Nó sẽ làm cho bảng cầu vồng cần thiết để đảo ngược hàm băm lớn hơn 1000 lần. Tôi sử dụng sha256 vì nó nhanh, nhưng vẫn được coi là an toàn.


Vì vậy, nếu mật khẩu của tôi là "345678" và muối ngẫu nhiên bạn thêm vào trước tình cờ là "12". Nếu ai đó nhập "45678" làm mật khẩu của tôi. Điều này có vẻ sai theo nhiều cách.
Yurippenet

-1

Thực sự, nó phụ thuộc vào loại tấn công mà bạn đang cố gắng bảo vệ dữ liệu của mình.

Mục đích của một muối duy nhất cho mỗi mật khẩu là ngăn chặn một cuộc tấn công từ điển vào toàn bộ cơ sở dữ liệu mật khẩu.

Việc mã hóa muối duy nhất cho mỗi mật khẩu sẽ khiến việc bẻ khóa từng mật khẩu trở nên khó khăn hơn, vâng, nhưng bạn phải cân nhắc xem liệu nó có thực sự mang lại nhiều lợi ích hay không. Nếu kẻ tấn công, bằng vũ lực, thấy rằng chuỗi này:

Marianne2ae85fb5d

băm thành một hàm băm được lưu trữ trong DB, có thực sự khó để tìm ra phần nào là pass và phần nào là muối?


2
Nếu ai đó vũ phu buộc một mật khẩu không thể đoán được như vậy, dù sao thì tôi cũng nói rằng bạn đã bị lừa, bởi vì rõ ràng họ có công nghệ mà chưa ai nghĩ ra.
Instance Hunter,
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.