Nên chọn hàm băm mật mã nào?


137

.NET framework có 6 thuật toán băm khác nhau:

  • MD5: 16 byte (Thời gian để băm 500MB: 1462 ms)
  • SHA-1: 20 byte (1644 ms)
  • SHA256: 32 byte (5618 ms)
  • SHA384: 48 byte (3839 ms)
  • SHA512: 64 byte (3820 ms)
  • RIPEMD: 20 byte (7066 ms)

Mỗi chức năng này thực hiện khác nhau; MD5 là nhanh nhất và RIPEMD là chậm nhất.

MD5 có lợi thế là nó phù hợp với loại Guid tích hợp; và nó là cơ sở của UUID loại 3 . Băm SHA-1 là cơ sở của loại 5 UUID. Điều này làm cho chúng thực sự dễ sử dụng để nhận dạng.

MD5 tuy nhiên dễ bị tấn công do va chạm , SHA-1 cũng dễ bị tổn thương nhưng ở mức độ thấp hơn.

Trong những điều kiện tôi nên sử dụng thuật toán băm nào?

Những câu hỏi đặc biệt tôi thực sự tò mò muốn xem câu trả lời là:

  • Là MD5 không đáng tin cậy? Trong các tình huống thông thường khi bạn sử dụng thuật toán MD5 không có mục đích độc hại và không có bên thứ ba nào có ý định độc hại, bạn sẽ mong đợi BẤT K coll va chạm nào (có nghĩa là hai byte tùy ý [] tạo ra cùng một hàm băm)

  • RIPEMD tốt hơn SHA1 bao nhiêu? (nếu tốt hơn) thì tính toán chậm hơn 5 lần nhưng kích thước băm giống như SHA1.

  • Tỷ lệ nhận được các va chạm không độc hại khi băm tên tệp (hoặc các chuỗi ngắn khác) là gì? (Ví dụ: 2 tên tệp ngẫu nhiên có cùng hàm băm MD5) (với MD5 / SHA1 / SHA2xx) Nói chung, tỷ lệ cược cho các va chạm không độc hại là gì?

Đây là điểm chuẩn tôi đã sử dụng:

    static void TimeAction(string description, int iterations, Action func) {
        var watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < iterations; i++) {
            func();
        }
        watch.Stop();
        Console.Write(description);
        Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
    }

    static byte[] GetRandomBytes(int count) {
        var bytes = new byte[count];
        (new Random()).NextBytes(bytes);
        return bytes;
    }


    static void Main(string[] args) {

        var md5 = new MD5CryptoServiceProvider();
        var sha1 = new SHA1CryptoServiceProvider();
        var sha256 = new SHA256CryptoServiceProvider();
        var sha384 = new SHA384CryptoServiceProvider();
        var sha512 = new SHA512CryptoServiceProvider();
        var ripemd160 = new RIPEMD160Managed();

        var source = GetRandomBytes(1000 * 1024);

        var algorithms = new Dictionary<string,HashAlgorithm>();
        algorithms["md5"] = md5;
        algorithms["sha1"] = sha1;
        algorithms["sha256"] = sha256;
        algorithms["sha384"] = sha384;
        algorithms["sha512"] = sha512;
        algorithms["ripemd160"] = ripemd160;

        foreach (var pair in algorithms) {
            Console.WriteLine("Hash Length for {0} is {1}", 
                pair.Key, 
                pair.Value.ComputeHash(source).Length);
        }

        foreach (var pair in algorithms) {
            TimeAction(pair.Key + " calculation", 500, () =>
            {
                pair.Value.ComputeHash(source);
            });
        }

        Console.ReadKey();
    }

15
Việc bạn đề cập đến md5 phù hợp với định dạng GUID (16 byte) cho thấy sự hiểu lầm cơ bản. Băm không được đảm bảo là duy nhất, nhưng rất hiếm (và khó giả mạo nếu được sử dụng theo nghĩa mật mã) và xuất phát từ điều đó là băm trong khi GUID, tốt, duy nhất nhưng không liên quan đến nội dung của điều nó xác định. Chúng được sử dụng cho các mục đích rất khác nhau.
Barry Wark

1
Đúng nó không liên quan, nó chỉ là một thực tế cụ thể thực hiện tiện dụng. Tôi hiểu rằng bạn không thể điều chỉnh vô hạn thành 16 byte. Bạn có thể nhận được các va chạm với thuật toán băm BẤT K
Sam Saffron

5
Ngoài ra, một Guid chỉ là thực tế duy nhất, theo lý thuyết nếu bạn tiếp tục tạo ra các Hướng dẫn cuối cùng bạn sẽ nhận được các bản sao.
Sam Saffron

3
Bạn thực sự không nên nhét băm vào GUID, ngay cả khi nó phù hợp. Ví dụ đơn giản nhất: hai bản sao của cùng một tệp nên có GUID khác nhau, nhưng cùng một hàm băm. 8 chữ cái đầu tiên của tên một người cũng khá phù hợp với 16 byte.
dbkk

2
@ user2332868 Phá vỡ SHA-1 không ảnh hưởng đến xác suất va chạm do tai nạn . Khi mục đích độc hại là mối đe dọa cho việc sử dụng của bạn, tôi nghĩ rằng việc chọn bất kỳ hàm băm nào là sai và bạn cần dành thời gian để phân tích rủi ro / chi phí cho trường hợp cụ thể của mình.
Andrey Tarantsov

Câu trả lời:


138

Trong mật mã, hàm băm cung cấp ba hàm riêng biệt.

  1. Kháng va chạm : Làm thế nào khó khăn để ai đó tìm thấy hai tin nhắn ( bất kỳ hai tin nhắn) mà băm giống nhau.
  2. Kháng Preimage : Đưa ra một hàm băm, thật khó để tìm một thông điệp khác băm tương tự? Còn được gọi là hàm băm một chiều .
  3. Kháng cự tiền đề thứ hai : Đưa ra một tin nhắn, tìm một tin nhắn khác băm tương tự.

Các tính chất này có liên quan nhưng độc lập. Ví dụ, khả năng chống va chạm ngụ ý khả năng chống va chạm thứ hai, nhưng không phải là cách khác. Đối với bất kỳ ứng dụng nào, bạn sẽ có các yêu cầu khác nhau, cần một hoặc nhiều thuộc tính này. Hàm băm để bảo mật mật khẩu trên máy chủ thường sẽ chỉ yêu cầu kháng tiền, trong khi thông báo tiêu hóa yêu cầu cả ba.

Tuy nhiên, MD5 không chống va chạm, tuy nhiên, điều đó không loại trừ việc sử dụng nó trong các ứng dụng không yêu cầu chống va chạm. Thật vậy, MD5 thường vẫn được sử dụng trong các ứng dụng có kích thước và tốc độ khóa nhỏ hơn có lợi. Điều đó nói rằng, do sai sót của nó, các nhà nghiên cứu khuyên bạn nên sử dụng các hàm băm khác trong các kịch bản mới.

SHA1 có một lỗ hổng cho phép tìm thấy các va chạm trong lý thuyết ít hơn nhiều so với 2 ^ 80 bước mà một hàm băm an toàn có độ dài sẽ yêu cầu. Cuộc tấn công liên tục được sửa đổi và hiện có thể được thực hiện trong ~ 2 ^ 63 bước - chỉ trong phạm vi tính toán hiện tại. Vì lý do này, NIST đang loại bỏ việc sử dụng SHA1, nói rằng nên sử dụng họ SHA2 sau năm 2010.

SHA2 là một họ hàm băm mới được tạo sau SHA1. Hiện tại không có cuộc tấn công nào được biết đến chống lại các chức năng SHA2. SHA256, 384 và 512 đều thuộc họ SHA2, chỉ sử dụng các độ dài khóa khác nhau.

RIPEMD Tôi không thể bình luận quá nhiều, ngoại trừ lưu ý rằng nó không được sử dụng phổ biến như các gia đình SHA, và do đó không được các nhà nghiên cứu mật mã nghiên cứu kỹ lưỡng. Vì lý do đó một mình tôi sẽ khuyên bạn nên sử dụng các hàm SHA trên nó. Trong quá trình thực hiện bạn đang sử dụng có vẻ khá chậm, điều này làm cho nó ít hữu ích hơn.

Tóm lại, không có một chức năng tốt nhất - tất cả phụ thuộc vào những gì bạn cần nó cho. Hãy chú ý đến các sai sót với từng lỗi và bạn sẽ có thể tốt nhất để chọn hàm băm phù hợp cho kịch bản của mình .


1
Thực sự đánh giá cao bạn đi vào mức độ chi tiết này. Điều này rất hữu ích.
joelc

1
Đối với một số ứng dụng, ngay cả hàm băm không cấp mã hóa cũng có thể phù hợp. OP không bao giờ đề cập nếu nó dành riêng cho mật khẩu, hoặc xác thực phản hồi thử thách hoặc cho mã thông báo truy cập hoặc chỉ để lập chỉ mục một chuỗi các chuỗi / tệp. Hiệu suất, mặt khác, là một mối quan tâm đối với OP ...
Seva Alekseyev

111

Tất cả các hàm băm đều bị "hỏng"

Các nguyên tắc chuồng bồ câu nói rằng thử khó như bạn sẽ không thể phù hợp hơn 2 con chim bồ câu trong 2 lỗ (trừ khi bạn cắt chim bồ câu trở lên). Tương tự, bạn không thể ghép 2 ^ 128 + 1 số vào 2 ^ 128 vị trí. Tất cả các hàm băm dẫn đến một hàm băm có kích thước hữu hạn, điều này có nghĩa là bạn luôn có thể tìm thấy xung đột nếu bạn tìm kiếm thông qua "kích thước hữu hạn" + 1 chuỗi. Nó chỉ không khả thi để làm như vậy. Không dành cho MD5 và không dành cho Skein .

MD5 / SHA1 / Sha2xx không có va chạm cơ hội

Tất cả các hàm băm có va chạm, đó là một thực tế của cuộc sống. Tình cờ gặp phải những va chạm này tương đương với việc trúng xổ số giữa các thiên hà . Điều đó có nghĩa là, không ai trúng xổ số giữa các thiên hà , đó không phải là cách xổ số hoạt động. Bạn sẽ không bắt gặp hàm băm MD5 / SHA1 / SHA2XXX tình cờ, EVER. Mỗi từ trong mỗi từ điển, trong mọi ngôn ngữ, băm đến một giá trị khác nhau. Mỗi tên đường dẫn, trên mỗi máy trên toàn hành tinh đều có hàm băm MD5 / SHA1 / SHA2XXX khác nhau. Làm thế nào để tôi biết điều đó, bạn có thể hỏi. Vâng, như tôi đã nói trước đây, không ai trúng xổ số liên thiên hà, bao giờ.

Nhưng ... MD5 bị hỏng

Đôi khi thực tế là nó bị hỏng không thành vấn đề .

Vì hiện tại không có cuộc tấn công tiền ảnh hoặc hình ảnh thứ hai nào được biết đến trên MD5.

Vì vậy, những gì đã bị phá vỡ về MD5, bạn có thể yêu cầu? Có thể cho bên thứ ba tạo 2 tin nhắn, một trong số đó là EVIL và một trong số đó là TỐT mà cả hai đều băm với cùng một giá trị. ( Tấn công va chạm )

Tuy nhiên, khuyến nghị RSA hiện tại là không sử dụng MD5 nếu bạn cần kháng ảnh trước. Mọi người có xu hướng sai lầm khi thận trọng khi nói đến các thuật toán bảo mật.

Vậy tôi nên sử dụng hàm băm nào trong .NET?

  • Sử dụng MD5 nếu bạn cần tốc độ / kích thước và không quan tâm đến các cuộc tấn công sinh nhật hoặc tấn công trước hình ảnh.

Lặp lại điều này sau tôi, không có cơ hội va chạm MD5 , va chạm độc hại có thể được thiết kế cẩn thận. Mặc dù không có các cuộc tấn công tiền ảnh được biết đến cho đến nay trên MD5, dòng từ các chuyên gia bảo mật là MD5 không nên được sử dụng khi bạn cần bảo vệ chống lại các cuộc tấn công trước ảnh. CÙNG đi cho SHA1 .

Hãy nhớ rằng, không phải tất cả các thuật toán cần phải bảo vệ chống lại các cuộc tấn công trước hình ảnh hoặc va chạm. Lấy trường hợp tầm thường của tìm kiếm vượt qua đầu tiên cho các tệp trùng lặp trên HD của bạn.

  • Sử dụng hàm dựa trên SHA2XX nếu bạn muốn hàm băm bảo mật bằng mật mã.

Không ai tìm thấy bất kỳ va chạm SHA512. KHÔNG BAO GIỜ. Họ đã rất cố gắng. Đối với vấn đề đó, không ai từng tìm thấy bất kỳ va chạm SHA256 hoặc 384 bao giờ. .

  • Không sử dụng SHA1 hoặc RIPEMD trừ khi nó dành cho kịch bản tương tác.

RIPMED đã không nhận được sự xem xét kỹ lưỡng như SHAX và MD5 đã nhận được. Cả SHA1 và RIPEMD đều dễ bị tấn công sinh nhật. Cả hai đều chậm hơn MD5 trên .NET và có kích thước 20 byte vụng về. Thật vô nghĩa khi sử dụng các chức năng này, hãy quên chúng đi.

Các cuộc tấn công va chạm SHA1 đã giảm xuống còn 2 ^ 52, nó sẽ không quá lâu cho đến khi các vụ va chạm SHA1 diễn ra ngoài tự nhiên.

Để cập nhật thông tin về các hàm băm khác nhau, hãy xem sở thú hàm băm .

Nhưng chờ đợi, có nhiều hơn nữa

Có một hàm băm nhanh có thể là một lời nguyền. Ví dụ: một cách sử dụng rất phổ biến cho các hàm băm là lưu trữ mật khẩu. Về cơ bản, bạn tính toán hàm băm của mật khẩu kết hợp với chuỗi ngẫu nhiên đã biết (để ngăn chặn các cuộc tấn công cầu vồng) và lưu trữ hàm băm đó trong cơ sở dữ liệu.

Vấn đề là, nếu kẻ tấn công nhận được một bãi chứa cơ sở dữ liệu, anh ta hoàn toàn có thể đoán mật khẩu bằng cách sử dụng brute-force. Mỗi sự kết hợp anh ta cố gắng chỉ mất một phần nghìn giây và anh ta có thể thử hàng trăm ngàn mật khẩu mỗi giây.

Để giải quyết vấn đề này, thuật toán bcrypt có thể được sử dụng, nó được thiết kế chậm nên kẻ tấn công sẽ bị chậm rất nhiều nếu tấn công hệ thống bằng bcrypt. Gần đây, tiền điện tử đã đưa ra một số tiêu đề và được một số người coi là hiệu quả hơn bcrypt nhưng tôi không biết về việc triển khai .Net.


Trong khi cả MD5 và SHA-1 đã bị suy yếu, MD5 yếu hơn nhiều so với SHA-1, trong khi chỉ nhanh hơn một chút. Các va chạm MD5 thực tế đã được tìm thấy và sử dụng để khai thác trong thế giới thực (giả mạo chứng chỉ CA), nhưng theo tôi biết không có va chạm SHA-1 thực tế nào được tìm thấy (mặc dù số lượng hoạt động đã giảm đáng kể từ lực lượng vũ phu). Và cho biết MD5 yếu hơn bao nhiêu, tôi sẽ không ngạc nhiên nếu các cuộc tấn công tiền giả thứ hai xuất hiện sớm hơn đối với MD5 so với SHA-1. Vì vậy, tôi nghĩ bạn nên sử dụng SHA-1 nếu bạn cần tốc độ và không chống va chạm, và nếu không thì sử dụng một trong những gia đình SHA-2.
Brian Campbell

1
@Brian khá rõ ràng rằng trong vài năm tới mọi người sẽ có thể thực hiện các cuộc tấn công va chạm vào SHA1, điều này sẽ giúp SHA1 trở nên hữu ích như MD5, Chứng chỉ CA là một cuộc tấn công va chạm, tương tự trong vài năm nữa mọi người sẽ có thể để thực hiện cuộc tấn công tương tự vào chứng chỉ SHA1 CA. Cuộc tấn công phụ thuộc vào một bên độc hại tạo ra EVIL và chứng chỉ TỐT. Không có cuộc tấn công nguyên thủy nào được biết đến trên MD5 và thực tế là có các cuộc tấn công va chạm không làm cho các cuộc tấn công tiền ảnh ít nhiều có khả năng xảy ra.
Sam Saffron

Nó ít hơn nhiều về việc bạn sử dụng hàm băm nào cho mật khẩu, hơn là hàm băm. Nếu muối của bạn được biết thì cơ sở dữ liệu của bạn ngay lập tức dễ bị tấn công từ điển; nếu muối của bạn là thủ tục và hệ thống tập tin của bạn bị xâm phạm, bạn (lại) dễ bị tổn thương; nếu muối của bạn bị bỏ qua, bạn lại bị xâm phạm. Bảo mật có vấn đề là, không có vấn đề gì, CÁI GÌ được băm. Chứng chỉ, tôi sẽ không giải quyết vì tôi chưa xử lý chúng với tư cách là một lập trình viên (IE, tạo, hiểu, v.v.).
Robert K

Thuật ngữ bị hỏng có một ý nghĩa cụ thể trong bối cảnh băm và đó không phải là ý nghĩa mà câu trả lời này nhấn mạnh. Tất cả câu trả lời này sẽ làm là gây nhầm lẫn.
Joel McBeth

1
Đây là một câu trả lời tuyệt vời vì nó tập trung vào thực tiễn. Băm được sử dụng cho những thứ khác ngoài bảo mật (chẳng hạn như tạo khóa tra cứu bộ đệm cho dữ liệu không nhạy cảm hoặc xác định xem một đối tượng được tuần tự hóa có thay đổi hay không). Cơ hội của một cuộc tấn công được nhắm mục tiêu là gần như bằng không (không bao giờ nói không bao giờ) và ngay cả khi một cuộc tấn công thành công, nó sẽ không có tác động vật chất. Công việc tuyệt vời tập trung vào các tác động thực tế (thay vì lý thuyết).
DVK

35

Cập nhật:

Thời thế đã thay đổi, chúng ta có một người chiến thắng SHA3. Tôi sẽ khuyên bạn nên sử dụng người chiến thắng keccak (còn gọi là SHA3 ) của cuộc thi SHA3.

Câu trả lời gốc:

Theo thứ tự từ yếu nhất đến mạnh nhất tôi sẽ nói:

  1. RIPEMD BROKEN, Không bao giờ nên được sử dụng như có thể thấy trong pdf này
  2. MD-5 MÔI GIỚI, Không bao giờ nên được sử dụng, có thể bị hỏng trong 2 phút với máy tính xách tay
  3. SHA-1 MÔI GIỚI, không bao giờ nên được sử dụng, bị hỏng trong hiệu trưởng, các cuộc tấn công đang trở nên tốt hơn theo tuần
  4. SHA-2 WEAK, có thể sẽ bị phá vỡ trong vài năm tới. Một vài điểm yếu đã được tìm thấy. Lưu ý rằng nhìn chung kích thước khóa càng cao, hàm băm càng khó phá vỡ. Mặc dù kích thước khóa = sức mạnh không phải lúc nào cũng đúng, nhưng điều đó chủ yếu là đúng. Vì vậy, SHA-256 có lẽ yếu hơn SHA-512.
  5. Skein NO KNOWN WEAKNESSES, là một ứng cử viên cho SHA-3 . Nó là khá mới và do đó chưa được kiểm tra. Nó đã được thực hiện trong một loạt các ngôn ngữ.
  6. MD6 NO KNOWN WEAKNESSES, là một ứng cử viên khác cho SHA-3. Có lẽ mạnh hơn Skien, nhưng chậm hơn trên các máy lõi đơn. Giống như Skien, nó chưa được kiểm tra. Một số nhà phát triển có đầu óc bảo mật đang sử dụng nó, trong các vai trò quan trọng .

Cá nhân tôi sẽ sử dụng MD6, vì người ta không bao giờ có thể quá hoang tưởng. Nếu tốc độ là mối quan tâm thực sự tôi sẽ xem xét Skein hoặc SHA-256.


5
Tôi sẽ không đưa Skein và MD6 lên cao trong danh sách; có một lý do mà cuộc thi SHA-3 sẽ không kết thúc cho đến cuối năm 2012. Phải mất một thời gian dài và rất nhiều người tin rằng một hàm băm thực sự có khả năng được bảo mật và cả hai chức năng này đều không đã được khoảng đủ lâu cho điều đó chưa.
Eric Burnett

Tôi đồng ý với tình cảm của bạn, nhưng tôi nghĩ cộng đồng đang ở một vị trí lạ. Tất cả các hàm băm đang sử dụng rất nguy hiểm khi bị phá vỡ (có thể, có thể, không phải SHA2 256-512) và chúng tôi phải chờ đến năm 2012 để chọn thay thế. chọn chất độc của bạn: yếu / hỏng hoặc chưa được kiểm tra (hầu hết các ứng cử viên NIST đã không được công khai trong hơn 6 tháng)? Lựa chọn khó khăn.
Ethan Heilman

5
RIPEMD bị hỏng, nhưng RIPEMD-128/160/256 thì khác và không bị hỏng.
Bwooce

Tôi không biết về bất kỳ triển khai nào của Skein cho .NET. Tôi đã đi qua SkeinFish và nskein, và cả hai đều rất chậm.
Cocowalla

1
Tôi sẽ đợi bằng cách sử dụng SHA-3 cho đến khi tiêu chuẩn thực sự được đưa ra ngoài, ít nhất là nếu bạn muốn thực sự tuân theo một tiêu chuẩn. Thuật toán tự nó có quá nhiều lựa chọn.
Paŭlo Ebermann

3

Để bảo vệ MD5, không có cách nào để tạo một tệp có hàm băm MD5 tùy ý. Tác giả ban đầu phải lên kế hoạch trước để có một vụ va chạm làm việc. Do đó, nếu người nhận tin tưởng người gửi, MD5 vẫn ổn. MD5 bị hỏng nếu người ký là độc hại, nhưng nó không được biết là dễ bị tấn công bởi người trung gian.


1
Mặc dù tôi không phải là một chuyên gia trong lĩnh vực này, nhưng gần như không thể tính toán các băm MD5 tùy ý bằng vũ lực ngày nay?
mafu

@mafu: Phản hồi muộn ở đây, nhưng có thể tính toán bất kỳ hàm băm nào thông qua lực lượng vũ phu. Nó chỉ có thể mất một thời gian thực sự dài.
Chiến tranh

@ItzWarty Tôi đặc biệt đề cập đến thời gian cần thiết - vì MD5 khá ngắn, tôi đoán rằng có thể chỉ cần ném một nguồn tính toán hợp lý lên nó (E3 hoặc một mạng máy tính giá rẻ một vài máy có vài card đồ họa, một cái gì đó dọc theo các dòng đó) và có thể tính toán hàm băm MD5 tùy ý trong vòng vài ngày.
mafu

@mafu Một cuộc tấn công tiền ảnh có chi phí 2 ^ 127 lệnh băm cho hàm băm 128 bit. Điều này là xa khả thi. 2 ^ 80 lời mời là khả thi nhưng đã rất tốn kém.
CodeInChaos

2

Cái nào bạn sử dụng thực sự phụ thuộc vào những gì bạn đang sử dụng nó cho. Nếu bạn chỉ muốn đảm bảo rằng các tệp không bị hỏng trong quá trình vận chuyển và không quan tâm đến bảo mật, hãy nhanh chóng và nhỏ. Nếu bạn cần chữ ký điện tử cho các thỏa thuận cứu trợ liên bang trị giá hàng tỷ đô la và cần đảm bảo rằng chúng không bị giả mạo, hãy tìm cách giả mạo và chậm chạp.


1
Đã nhiều lần khi thảo luận về các giải pháp cho vấn đề tôi đề cập đến việc tôi sử dụng MD5 để nhận dạng nhanh (băm một chuỗi), họ nói "nhưng md5 bị hỏng ... không sử dụng nó, sử dụng sha1" ... Tôi không thực sự đăng ký vào điều này đã tự hỏi nếu bất cứ điều gì bị phá vỡ cơ bản với một số hàm băm yếu hơn thì chúng nên tránh ... ví dụ: trường hợp công việc thực tế khi dữ liệu bình thường tạo ra va chạm
Sam Saffron

Thấy MD5 hoạt động tốt với hàng triệu người trong mười lăm năm, tôi nghi ngờ rằng nó ổn với bạn nếu bảo mật băm không quan trọng.
mqp

2
@sambo MD5 hoạt động tốt đối với hầu hết mọi trường hợp trừ khi bảo mật / tính toàn vẹn thực sự của hệ thống của bạn phụ thuộc vào việc ngăn chặn va chạm.
Rex M

2

Tôi muốn kêu gọi (trước khi md5 bị xé toạc) rằng tôi vẫn sử dụng md5 một cách rộng rãi mặc dù sự phá vỡ quá lớn của nó đối với rất nhiều tiền điện tử.

Miễn là bạn không quan tâm đến việc bảo vệ chống va chạm (bạn vẫn an toàn khi sử dụng md5 trong hmac) và bạn muốn tốc độ (đôi khi bạn muốn băm chậm hơn) thì bạn vẫn có thể sử dụng md5 một cách tự tin.


@ Giống như tôi với bạn về điều đó, đó là loại mà tôi đang tìm kiếm với câu hỏi này, là một cái gì đó về các hàm băm yếu hơn về cơ bản bị phá vỡ mà chúng không bao giờ nên được sử dụng.
Sam Saffron

Hơn nữa, nếu dữ liệu hoặc bảo mật yêu cầu của dữ liệu có tuổi thọ ngắn hơn thời gian bẻ khóa (một vài phút trong những ngày này) thì MD5 hoàn toàn ổn. Tình huống hữu ích nhưng vẫn hữu ích là điểm.
annakata

@annakata - Hãy nhớ rằng bạn cũng sẽ phải tránh sử dụng lại các khóa trên nhiều tin nhắn để có thể sử dụng được trong những trường hợp đó.
Steve Westbrook

2

Nó sẽ là một ideea tốt để xem xét BLAKE2 .

Như được mô tả, nó nhanh hơn MD5 và ít nhất là an toàn như SHA-3. Nó cũng được thực hiện bởi một số ứng dụng phần mềm , bao gồm WinRar.


Nó có thể nhanh hơn ngoại trừ nhiều triển khai có hỗ trợ phần cứng khiến SHA-256 khá nhanh.
zaph

Tôi đồng ý. tính đến năm 2019, Blake2b là hàm băm có mục đích chung tốt nhất được phát hành cho đến nay. Nhanh hơn đáng kể so với tất cả các lựa chọn thay thế khác, và không kém phần an toàn (ít nhất là theo bất kỳ cách có ý nghĩa nào) và có thể được thực thi chỉ trong 336 byte ram (168 cho blake2s), ồ, và nó được tối ưu hóa cho các CPU nhỏ cuối cùng, đó là endian chiếm ưu thế trên các hệ thống ngày nay.
hanshenrik

0

Tôi không phải là một chuyên gia về vấn đề này, nhưng tôi theo kịp cộng đồng bảo mật và rất nhiều người ở đó coi băm md5 bị hỏng. Tôi muốn nói rằng cái nào sẽ sử dụng phụ thuộc vào mức độ nhạy cảm của dữ liệu và ứng dụng cụ thể. Bạn có thể có thể thoát khỏi một hàm băm kém an toàn hơn một chút miễn là khóa này tốt và mạnh.


1
Hàm băm thường không sử dụng khóa
Ethan Heilman

0

Dưới đây là những gợi ý của tôi dành cho bạn:

  1. Có lẽ bạn nên quên MD5 nếu bạn lường trước các cuộc tấn công. Có nhiều bàn cầu vồng cho họ trực tuyến và các tập đoàn như RIAA đã được biết là có thể tạo ra các chuỗi với các giá trị băm tương đương.
  2. Sử dụng muối nếu bạn có thể. Bao gồm độ dài tin nhắn trong tin nhắn có thể làm cho rất khó tạo ra xung đột băm hữu ích.
  3. Theo nguyên tắc chung, nhiều bit hơn có nghĩa là ít va chạm hơn (theo nguyên tắc pigeonhole) và chậm hơn, và có thể an toàn hơn (trừ khi bạn là một thiên tài toán học có thể tìm thấy các lỗ hổng).

Xem ở đây để có một bài viết chi tiết một thuật toán để tạo ra va chạm md5 trong 31 giây với máy tính Intel P4 để bàn.

http://eprint.iacr.org/2006/105


Nhận xét này rất cũ và có vẻ khá bị chôn vùi, nhưng bit này - RIAA đã được biết là có thể tạo ra các chuỗi với băm tương đương - nhảy ra với tôi, và tôi rất tò mò bối cảnh cho việc này là gì. Cụ thể, MD5 tàn bạo 8 năm trước ít tầm thường hơn so với năm 2017, vì vậy họ phải có một lý do khá chính đáng.
i336_
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.