Salting mật khẩu của bạn: Thực tiễn tốt nhất?


162

Tôi đã luôn tò mò ... Điều gì tốt hơn khi muối mật khẩu để băm: tiền tố hoặc hậu tố? Tại sao? Hoặc nó có vấn đề, miễn là bạn muối?

Để giải thích: Hiện tại tất cả chúng ta đều biết rằng chúng ta nên muối mật khẩu trước khi băm mật khẩu để lưu trữ trong cơ sở dữ liệu [ Chỉnh sửa: Vì vậy, bạn có thể tránh những điều như những gì đã xảy ra với Jeff Atwood gần đây ]. Thông thường, điều này được thực hiện bằng cách nối muối với mật khẩu trước khi chuyển qua thuật toán băm. Nhưng các ví dụ khác nhau ... Một số ví dụ trả trước muối trước mật khẩu. Một số ví dụ thêm muối sau mật khẩu. Tôi thậm chí đã thấy một số người cố gắng đặt muối vào giữa.

Vậy đâu là phương pháp tốt hơn, và tại sao? Có một phương pháp làm giảm cơ hội va chạm băm? Google Googling của tôi đã không đưa ra một phân tích tốt về chủ đề này.

Chỉnh sửa: Câu trả lời tuyệt vời folks! Tôi xin lỗi tôi chỉ có thể chọn một câu trả lời. :)



1
@Jaccco: đầu vào tuyệt vời. Cảm ơn!
Randolpho

3
Cách thực hành tốt nhất là sử dụng chức năng mã hóa thực hiện việc tạo muối cho bạn, sử dụng PBKDF2 (tiêu chuẩn), bcrypt hoặc thậm chí là tiền điện tử. Cảm ơn Stephen đã chỉ ra điều đó.
Maarten Bodewes

1
Khá nhiều tất cả các cấu trúc băm mật khẩu tiêu chuẩn đảm nhận việc kết hợp muối và mật khẩu, vì vậy bạn không nên lo lắng về điều này. Nếu bạn không sử dụng hàm băm mật khẩu tiêu chuẩn, hãy di chuyển sang một mật khẩu.
CodeInChaos

1
@Omu Khuyến nghị không tốt. 1) Một lần lặp duy nhất của SHA-1 là quá nhanh, bạn nên sử dụng ít nhất 10000 và thậm chí là khá yếu. 2) Muối mặc định quá nhỏ. 8 byte là tối thiểu và 16 được khuyến nghị.
CodeInChaos

Câu trả lời:


111

Tiền tố hoặc hậu tố là không liên quan, nó chỉ là về việc thêm một số entropy và độ dài cho mật khẩu.

Bạn nên xem xét ba điều sau:

  1. Muối phải khác nhau cho mỗi mật khẩu bạn lưu trữ. (Đây là một sự hiểu lầm khá phổ biến.)
  2. Sử dụng một trình tạo số ngẫu nhiên an toàn bằng mật mã.
  3. Chọn một muối đủ dài. Hãy nghĩ về vấn đề sinh nhật.

Có một câu trả lời tuyệt vời của Dave Sherohman cho một câu hỏi khác tại sao bạn nên sử dụng muối được tạo ngẫu nhiên thay vì tên người dùng (hoặc dữ liệu cá nhân khác). Nếu bạn làm theo những gợi ý đó, thực sự không có vấn đề gì khi bạn bỏ muối vào.


4
Tôi đã thêm một liên kết đến một câu hỏi cũ, đọc những câu trả lời. Về cơ bản, bằng cách không sử dụng một loại muối ngẫu nhiên khác nhau cho mỗi mật khẩu, bạn đang gặp rủi ro bảo mật không cần thiết, đó có thể là một vấn đề thực sự trong tương lai.
Georg Schölly

39
Muối ngẫu nhiên trên toàn trang web rất tệ, vì kẻ tấn công có thể tính toán trước các bảng cầu vồng và lấy toàn bộ cơ sở dữ liệu người dùng của bạn. Nếu bạn không hiểu điều này, xin vui lòng không viết hệ thống đăng nhập / bảo mật :) - bạn CẦN muối cho mỗi người dùng.
snemarch

3
Có, muối cho mỗi người dùng. Lý tưởng nhất là với các lần lặp cho mỗi người dùng được lưu trữ (vì vậy bạn có thể tăng số lần lặp được sử dụng theo thời gian). Bất kỳ khuôn khổ phong nha sẽ có tích hợp này. (.NET có PasswordDeriveBytes sẽ xử lý mọi thứ cho bạn.)
MichaelGG

2
Nếu bạn đang thiết kế bất kỳ loại hệ thống bảo mật nào, thì nó sẽ không sử dụng muối cho mỗi người dùng. trang web của bạn có thể không thú vị lắm, nhưng hãy xem xét người dùng sử dụng cùng một mật khẩu trên nhiều trang web ... cố gắng giữ an toàn cho cơ sở dữ liệu có xu hướng thất bại :)
snemarch

2
Tất nhiên muối bảo vệ chống lại các cuộc tấn công từ điển, chính xác bằng cách làm cho chúng chậm hơn nhiều. Việc sử dụng muối trong mật khẩu vượt xa các bảng cầu vồng. Các muối được thêm vào đặc biệt để làm chậm các cuộc tấn công từ điển, bằng cách ngăn chặn những kẻ tấn công băm mật khẩu một lần sau đó so sánh nó với tất cả người dùng.
Glenn Maynard

27

Tôi nghĩ đó là tất cả ngữ nghĩa. Đặt nó trước hoặc sau không quan trọng ngoại trừ chống lại một mô hình mối đe dọa rất cụ thể.

Thực tế là nó có nhiệm vụ đánh bại các bảng cầu vồng.

Mô hình mối đe dọa mà tôi đã đề cập sẽ là kịch bản trong đó đối thủ có thể có các bảng cầu vồng của các muối thông thường được nối / thêm vào mật khẩu. (Nói NSA) Bạn đoán họ có được nối thêm hoặc trả trước nhưng không phải cả hai. Điều đó thật ngớ ngẩn, và đó là một dự đoán kém.

Sẽ tốt hơn nếu giả định rằng họ có khả năng lưu trữ các bảng cầu vồng này, nhưng không, giả sử, các bảng có muối lạ xen kẽ ở giữa mật khẩu. Trong đó trường hợp hẹp, tôi sẽ phỏng đoán rằng xen kẽ sẽ là tốt nhất.

Như tôi đã nói. Đó là ngữ nghĩa. Chọn một loại muối khác nhau cho mỗi mật khẩu, một loại muối dài và bao gồm các ký tự lẻ trong đó như các ký hiệu và mã ASCII: ©


@onitherone, chết tiệt! Anh ấy đã phát hiện ra muối 'mật khẩu' của tôi!
Samuel

6
@Samuel: Tôi không biết về các bạn, nhưng chúng tôi sử dụng '12345' cho muối của chúng tôi. :)
Randolpho

@onitherone hợp lệ. Tôi thực sự có nghĩa là "chung" là "tất cả các muối dưới độ dài X trong ký tự Y" trong đó X, Y là hợp lý; nói 20 ký tự và chữ hoa / chữ thường. Có thể mở rộng để nói tất cả các chuỗi thập lục phân dưới độ dài Z (nói 160) vì tôi nghĩ rằng một bảng cầu vồng băm băm sẽ hữu ích ..
Tom Ritter

1
@Randolpho: Này, đó cũng là muối của tôi! Tỷ lệ cược là gì?
Adrien

Và đảm bảo rằng muối là không thể dự đoán / Ngẫu nhiên: stackoverflow.com/questions/1645161/
mẹo

18

Câu trả lời thực sự, mà dường như không ai chạm vào, là cả hai đều sai . Nếu bạn đang thực hiện tiền điện tử của riêng mình, bất kể một phần tầm thường mà bạn nghĩ bạn đang làm, bạn sẽ phạm sai lầm.

HMAC là một cách tiếp cận tốt hơn, nhưng ngay cả khi bạn đang sử dụng thứ gì đó như SHA-1, bạn đã chọn một thuật toán không phù hợp để băm mật khẩu do thiết kế của nó cho tốc độ. Sử dụng một cái gì đó như bcrypt hoặc có thể là tiền điện tử và loại bỏ hoàn toàn vấn đề khỏi tay bạn.

Ồ, và thậm chí không nghĩ về việc so sánh các giá trị băm kết quả cho sự bằng nhau với ngôn ngữ lập trình hoặc các tiện ích so sánh chuỗi cơ sở dữ liệu của bạn. Những người so sánh nhân vật theo nhân vật và ngắn mạch như falsethể một nhân vật khác nhau. Vì vậy, bây giờ những kẻ tấn công có thể sử dụng các phương pháp thống kê để thử và tìm ra hàm băm là gì, một ký tự tại một thời điểm.


1
Về đoạn cuối: làm thế nào kẻ tấn công có thể có được bất kỳ thông tin nào về số lượng nhân vật chính xác mà sự so sánh đã thất bại? Điều này vô nghĩa ..
halloweenlv

1
Bạn đều đúng và không chính xác. Các cuộc tấn công thời gian là có thật và đã được chứng minh nhiều lần là khả thi với độ chính xác đáng sợ ngay cả trên các kết nối mạng có độ trễ thay đổi để xác định chính xác nơi so sánh thất bại. Điều đó nói rằng, các cuộc tấn công thời gian thực sự không thể áp dụng cho các băm mật khẩu thông thường, vì không thể tính toán được các đầu vào chỉ thay đổi các phần nhỏ của đầu ra.
Stephen Touset

9

Nó không nên làm cho bất kỳ sự khác biệt. Băm sẽ không dễ đoán hơn bất cứ nơi nào bạn đặt muối. Va chạm băm là cả hiếm và không thể đoán trước, do cố tình phi tuyến tính. Nếu nó tạo ra sự khác biệt cho bảo mật, điều đó sẽ gợi ý một vấn đề với băm, không phải là muối.


1
Va chạm băm phụ thuộc vào kích thước của băm. Nhờ các sự cố va chạm sinh nhật khá có khả năng.
Georg Schölly

2
Chỉ khi bạn cắt ngắn kết quả. Dù sao, tôi vẫn đứng ở điểm rằng nó sẽ không tạo ra sự khác biệt ở nơi có muối, bởi vì điểm của hàm băm là làm cho mối quan hệ giữa đầu vào và đầu ra không chứa các mẫu.
Phil H

7

Nếu sử dụng hàm băm bảo mật bằng mật mã, việc bạn đặt trước hay hậu tố không thành vấn đề; một điểm băm là một thay đổi bit duy nhất trong dữ liệu nguồn (bất kể ở đâu) sẽ tạo ra một hàm băm khác nhau.

Có gì quan trọng, tuy nhiên, được sử dụng muối lâu, tạo ra chúng với một mật mã PRNG thích hợp, và có muối cho mỗi người dùng. Lưu trữ muối cho mỗi người dùng trong cơ sở dữ liệu của bạn là không một vấn đề an ninh, sử dụng một hash trang web rộng .


2
Sai anwser: kẻ tấn công có thể tính toán trước MD (pass) cho nhiều mật khẩu được sử dụng thường xuyên và sau đó tính MD (pass + salt) rất rẻ vì thông báo tiêu hóa hoạt động theo cách tăng dần để hỗ trợ truyền phát.
Erwan Legrand

5

Trước hết, thuật ngữ "bảng cầu vồng" luôn bị sử dụng sai. Bảng "cầu vồng" chỉ là một loại bảng tra cứu cụ thể , một bảng cho phép nén một loại dữ liệu cụ thể trên các phím. Bằng cách tính toán giao dịch cho không gian, một bảng tra cứu mất 1000 TB có thể được nén hàng nghìn lần để có thể được lưu trữ trên một ổ đĩa nhỏ hơn.

Bạn nên lo lắng về việc băm để bảng tra cứu mật khẩu, cầu vồng hoặc cách khác.

@ onitherone.livejournal.com:

Kẻ tấn công có 'bảng cầu vồng' không bao gồm các giá trị băm của các từ trong từ điển, mà là trạng thái của phép tính băm ngay trước khi hoàn thành phép tính băm.

Sau đó, có thể rẻ hơn khi bắt buộc nhập một tệp mật khẩu bằng muối postfix so với muối tiền tố: với mỗi từ trong từ điển, bạn sẽ tải trạng thái, thêm các byte muối vào hàm băm, sau đó hoàn tất nó. Với muối có tiền tố, sẽ không có gì chung giữa các tính toán cho mỗi từ trong từ điển.

Đối với một hàm băm đơn giản quét tuyến tính thông qua chuỗi đầu vào, chẳng hạn như một trình tạo cộng hưởng tuyến tính đơn giản, đây là một cuộc tấn công thực tế. Nhưng hàm băm bảo mật bằng mật mã được thiết kế có chủ ý để có nhiều vòng, mỗi vòng sử dụng tất cả các bit của chuỗi đầu vào, do đó, việc tính toán trạng thái bên trong ngay trước khi thêm muối không có ý nghĩa sau vòng đầu tiên. Ví dụ, SHA-1 có 80 viên đạn.

Hơn nữa, các thuật toán băm mật khẩu như PBKDF soạn thảo hàm băm của chúng nhiều lần (nên lặp lại PBKDF-2 tối thiểu 1000 lần, mỗi lần lặp lại áp dụng SHA-1 hai lần) khiến cho cuộc tấn công này trở nên không thực tế.


Bạn nên kiểm tra lại mô tả của các vòng. Các vòng là trên cơ sở mỗi chunk, không phải toàn bộ tin nhắn. (Mặt khác, băm dữ liệu phát trực tuyến sẽ yêu cầu tua lại nhiều lần.) Nhưng sử dụng các lần lặp lại sẽ ngăn vấn đề được đề cập.
MichaelGG

4

Băm BCrypt nếu nền tảng có nhà cung cấp. Tôi thích cách bạn không lo lắng về việc tạo ra muối và bạn có thể làm cho chúng mạnh hơn nữa nếu bạn muốn.


3
Như var tôi biết, BCrypt Hash cần muối, giống như bất kỳ kế hoạch băm nào khác.
Jacco

2

Chèn muối một số ký tự tùy ý vào mật khẩu là trường hợp ít được mong đợi nhất và do đó là "an toàn" nhất về mặt xã hội, nhưng nó thực sự không có ý nghĩa lắm trong trường hợp chung miễn là bạn sử dụng mật khẩu dài, duy nhất cho mỗi mật khẩu dây cho muối.

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.