ฉันควรเลือกฟังก์ชันแฮชการเข้ารหัสลับแบบใด


137

กรอบงาน. NET มาพร้อมกับอัลกอริทึมการแฮช 6 แบบ:

  • MD5: 16 ไบต์ (เวลาที่แฮช 500MB: 1462 ms)
  • SHA-1: 20 ไบต์ (1644 มิลลิวินาที)
  • SHA256: 32 ไบต์ (5618 ms)
  • SHA384: 48 ไบต์ (3839 มิลลิวินาที)
  • SHA512: 64 ไบต์ (3820 มิลลิวินาที)
  • RIPEMD: 20 ไบต์ (7066 ms)

แต่ละฟังก์ชันเหล่านี้ทำงานแตกต่างกัน MD5 นั้นเร็วที่สุดและ RIPEMD นั้นช้าที่สุด

MD5 มีข้อได้เปรียบที่เหมาะกับ Guid ประเภทในตัว; และมันก็เป็นพื้นฐานของประเภท 3 UUID แฮช SHA-1 เป็นพื้นฐานของประเภท 5 UUID ซึ่งทำให้พวกเขาใช้งานได้ง่ายมากสำหรับการระบุตัวตน

อย่างไรก็ตาม MD5 มีความเสี่ยงที่จะถูกโจมตีจากการชน SHA-1 ก็มีความเสี่ยงเช่นกัน แต่ในระดับที่น้อยกว่า

ฉันควรใช้อัลกอริทึมการแปลงแป้นพิมพ์แบบใดภายใต้เงื่อนไขใด

คำถามที่เฉพาะเจาะจงฉันอยากรู้อยากเห็นคำตอบคือ:

  • MD5 ไม่น่าเชื่อถือใช่ไหม ภายใต้สถานการณ์ปกติเมื่อคุณใช้อัลกอริทึม MD5 โดยไม่มีเจตนาที่เป็นอันตรายและไม่มีบุคคลที่สามที่มีเจตนาร้ายใด ๆ ที่คุณคาดหวังว่าจะมีการชนกันใด ๆ

  • RIPEMD ดีกว่า SHA1 มากแค่ไหน? (ถ้ามันดีกว่า) มันช้ากว่าการคำนวณ 5 เท่า แต่ขนาดแฮชจะเหมือนกับ SHA1

  • อัตราต่อรองของการชนที่ไม่เป็นอันตรายเมื่อ hashing ชื่อไฟล์ (หรือสตริงสั้น ๆ อื่น ๆ ) คืออะไร? (เช่นชื่อไฟล์สุ่ม 2 รายการที่มีแฮช MD5 เดียวกัน) (โดยมี MD5 / SHA1 / SHA2xx) โดยทั่วไปแล้วอัตราต่อรองของการชนที่ไม่เป็นอันตรายคืออะไร?

นี่คือมาตรฐานที่ฉันใช้:

    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
ความจริงที่ว่าคุณพูดถึง md5 เหมาะกับรูปแบบ GUID (16 ไบต์) แสดงให้เห็นถึงความเข้าใจผิดขั้นพื้นฐาน แฮชไม่รับประกันว่าจะไม่ซ้ำกัน แต่หายาก (และยากที่จะปลอมหากใช้ในการเข้ารหัสลับ) และมาจากสิ่งที่มันแฮชในขณะที่ GUID ดีไม่ซ้ำกัน แต่ไม่เกี่ยวข้องกับเนื้อหาของ สิ่งที่มันระบุ พวกเขาจะใช้เพื่อวัตถุประสงค์ที่แตกต่างกันมาก
แบร์รี่ Wark

1
แก้ไขที่ไม่เกี่ยวข้องมันเป็นเพียงการใช้งานจริงเฉพาะ ฉันเข้าใจว่าคุณไม่สามารถปรับอินฟินิตี้ให้เป็น 16 ไบต์ได้ คุณจะได้รับการชนกับขั้นตอนวิธีการใด ๆ คร่ำเครียด
แซม Saffron

5
Guid นั้นมีเอกลักษณ์ในทางปฏิบัติในทางทฤษฎีหากคุณยังคงสร้าง Guids ในที่สุดคุณจะได้รับซ้ำ
Sam Saffron

3
คุณไม่ควรแฮ็กข้อมูลลงใน GUID จริงๆแม้ว่าจะเหมาะสม ตัวอย่างที่ง่ายที่สุด: สำเนาสองไฟล์ของไฟล์เดียวกันควรมี GUID ต่างกัน แต่ใช้แฮชเดียวกัน ตัวอักษร 8 ตัวแรกของชื่อบุคคลนั้นค่อนข้างพอดีกับขนาด 16 ไบต์
dbkk

2
@ user2332868 การแบ่ง SHA-1 ไม่มีผลต่อความน่าจะเป็นของการชนโดยไม่ตั้งใจ เมื่อเจตนาร้ายประสงค์ร้ายเป็นภัยคุกคามต่อการใช้งานของคุณฉันคิดว่าการเลือกฟังก์ชั่นแฮชผิด ๆ และคุณจำเป็นต้องใช้เวลาในการวิเคราะห์ความเสี่ยง / ต้นทุนสำหรับกรณีเฉพาะของคุณ
Andrey Tarantsov

คำตอบ:


138

ในการเข้ารหัสลับฟังก์ชันแฮชจัดเตรียมสามฟังก์ชันแยกกัน

  1. ต้านทานชน : วิธีที่ยากก็คือสำหรับคนที่จะได้พบกับสองข้อความ ( ใด ๆสองข้อความ) ที่กัญชาเดียวกัน
  2. Preimage Resistance : เมื่อได้รับการแฮชมันยากแค่ไหนที่จะค้นหาข้อความอื่นที่แฮชเหมือนกัน? นอกจากนี้ยังเป็นที่รู้จักกันเป็นฟังก์ชันแฮชทางเดียว
  3. การต้านทาน preimage ที่สอง : รับข้อความค้นหาข้อความอื่นที่แฮชเหมือนกัน

คุณสมบัติเหล่านี้สัมพันธ์กัน แต่เป็นอิสระ ตัวอย่างเช่นความต้านทานการชนหมายถึงความต้านทาน preimage ที่สอง แต่ไม่ใช่วิธีอื่น ๆ สำหรับแอปพลิเคชันที่ระบุคุณจะมีข้อกำหนดที่แตกต่างกันโดยต้องการคุณสมบัติเหล่านี้อย่างน้อยหนึ่งรายการ ฟังก์ชั่นแฮชสำหรับการรักษารหัสผ่านบนเซิร์ฟเวอร์โดยปกติแล้วจะต้องใช้การต้านทานล่วงหน้าเท่านั้น

มีการแสดงให้เห็นว่า MD5 ไม่ต้านทานการชน แต่ไม่ได้กีดกันการใช้งานในแอพพลิเคชั่นที่ไม่ต้องการความต้านทานการชน แท้จริงแล้ว MD5 นั้นยังคงใช้ในแอปพลิเคชันซึ่งขนาดและความเร็วของคีย์ที่เล็กลงนั้นมีประโยชน์ ที่กล่าวว่าเนื่องจากข้อบกพร่องของนักวิจัยแนะนำให้ใช้ฟังก์ชันแฮชอื่น ๆ ในสถานการณ์ใหม่

SHA1 มีข้อบกพร่องที่อนุญาตให้พบการชนกันในทางทฤษฎีน้อยกว่า 2 ^ 80 ขั้นตอนจะต้องใช้ฟังก์ชันแฮชที่ปลอดภัยตามความยาวของมัน การจู่โจมกำลังได้รับการแก้ไขอย่างต่อเนื่องและในปัจจุบันสามารถทำได้ในขั้นตอน ~ 2 ^ 63 - เพิ่งจะอยู่ในขอบเขตของความสามารถในการคำนวณปัจจุบัน ด้วยเหตุนี้ NIST จึงยกเลิกการใช้ SHA1 โดยระบุว่าครอบครัว SHA2 ควรจะใช้งานหลังจากปี 2010

SHA2 เป็นกลุ่มฟังก์ชันแฮชใหม่ที่สร้างขึ้นหลังจาก SHA1 ขณะนี้ไม่มีการโจมตีที่รู้จักกับฟังก์ชั่น SHA2 SHA256, 384 และ 512 เป็นส่วนหนึ่งของตระกูล SHA2 ทั้งหมดโดยใช้ความยาวคีย์ที่แตกต่างกัน

RIPEMD ฉันไม่สามารถแสดงความคิดเห็นได้มากเกินไปยกเว้นว่าจะไม่เป็นที่ใช้กันทั่วไปในครอบครัว SHA ดังนั้นจึงไม่ได้รับการพิจารณาอย่างใกล้ชิดโดยนักวิจัยการเข้ารหัส ด้วยเหตุผลเพียงอย่างเดียวฉันอยากจะแนะนำให้ใช้ฟังก์ชั่น SHA มากกว่า ในการใช้งานที่คุณใช้ดูเหมือนจะค่อนข้างช้าเช่นกันซึ่งทำให้มีประโยชน์น้อยลง

โดยสรุปไม่มีฟังก์ชั่นที่ดีที่สุด - ทั้งหมดขึ้นอยู่กับสิ่งที่คุณต้องการ ระวังข้อบกพร่องในแต่ละข้อและคุณจะสามารถเลือกฟังก์ชันแฮชที่เหมาะสมที่สุดสำหรับสถานการณ์ของคุณ


1
ขอบคุณจริง ๆ ที่คุณเข้าสู่ระดับรายละเอียดนี้ สิ่งนี้มีประโยชน์มาก
joelc

1
สำหรับบางแอพพลิเคชั่นฟังก์ชั่นแฮชที่ไม่ใช่เกรดเข้ารหัสอาจเหมาะสม OP ไม่เคยพูดถึงว่ามันเป็นรหัสผ่านโดยเฉพาะหรือสำหรับการตอบกลับการท้าทายหรือการเข้าถึงโทเค็นหรือเพียงเพื่อทำดัชนีสตริง / ไฟล์จำนวนมาก ในทางกลับกันการแสดงนั้นเป็นเรื่องที่น่ากังวลสำหรับ OP ...
Seva Alekseyev

111

ฟังก์ชันแฮชทั้งหมด "แตก"

หลักรังนกพิราบกล่าวว่าพยายามที่ยากอย่างที่คุณคุณจะไม่สามารถใส่มากกว่า 2 นกพิราบใน 2 หลุม (ยกเว้นกรณีที่คุณตัดนกพิราบขึ้นไป) ในทำนองเดียวกันคุณไม่สามารถใส่หมายเลข 2 ^ 128 + 1 ใน 2 ^ 128 ช่องได้ ฟังก์ชันแฮชทั้งหมดส่งผลให้มีแฮชขนาด จำกัด ซึ่งหมายความว่าคุณสามารถค้นหาการชนกันได้เสมอหากคุณค้นหา "ขนาด จำกัด " + 1 ลำดับ มันเป็นไปไม่ได้ที่จะทำเช่นนั้น ไม่ได้สำหรับ MD5 และไม่เข็ด

MD5 / SHA1 / Sha2xx ไม่มีการชนกันของโอกาส

ฟังก์ชันแฮชทั้งหมดมีการชนกันมันเป็นความจริงของชีวิต มาในชนเหล่านี้โดยการเกิดอุบัติเหตุเป็นเทียบเท่าของที่ชนะการจับสลากอวกาศ กล่าวคือไม่มีใครชนะลอตเตอรี่อวกาศมันไม่ใช่วิธีที่ลอตเตอรี่ทำงาน คุณจะไม่เจอแฮช MD5 / SHA1 / SHA2XXX ที่ไม่ตั้งใจโดยไม่ได้ตั้งใจ ทุกคำในทุกพจนานุกรมในทุกภาษาจะมีค่าแตกต่างกัน ทุกชื่อพา ธ ในทุกเครื่องในโลกมีแฮช MD5 / SHA1 / SHA2XXX ที่แตกต่างกัน ฉันจะรู้ได้อย่างไรว่าคุณอาจถาม อย่างที่ฉันพูดไว้ก่อนหน้านี้ไม่มีใครชนะลอตเตอรี่อวกาศเลย

แต่ ... MD5 เสีย

บางครั้งความจริงที่ว่าเสียของมันไม่ได้เรื่อง

ในขณะที่มันยืนอยู่นั้นไม่มีการโจมตี pre-image หรือการ pre-image ที่สองใน MD5

MD5 จะเสียอะไรไปคุณถาม เป็นไปได้สำหรับบุคคลที่สามในการสร้าง 2 ข้อความซึ่งหนึ่งในนั้นคือความชั่วร้ายและอื่น ๆ ซึ่งเป็นสิ่งที่ดีที่ทั้งแฮชให้เป็นค่าเดียวกัน ( การโจมตีชน )

อย่างไรก็ตามข้อเสนอแนะ RSA ปัจจุบันไม่ควรใช้ MD5 หากคุณต้องการความต้านทานภาพล่วงหน้า ผู้คนมักจะทำผิดด้านความระมัดระวังเมื่อพูดถึงอัลกอริธึมความปลอดภัย

ดังนั้นฉันควรใช้ฟังก์ชัน hash อะไรใน. NET

  • ใช้ MD5 หากคุณต้องการความเร็ว / ขนาดและไม่สนใจการโจมตีวันเกิดหรือการโจมตีล่วงหน้า

ทำซ้ำสิ่งนี้หลังจากฉันไม่มีการชน MD5 โอกาสการชนที่เป็นอันตรายสามารถออกแบบอย่างระมัดระวัง แม้ว่าจะไม่มีการโจมตีล่วงหน้าของภาพที่รู้จักบน MD5 แต่สายจากผู้เชี่ยวชาญด้านความปลอดภัยก็คือไม่ควรใช้ MD5 ในที่ที่คุณต้องการป้องกันการโจมตีล่วงหน้า เดียวกันจะไปสำหรับ SHA1

โปรดทราบว่าอัลกอริทึมทั้งหมดไม่จำเป็นต้องป้องกันการโจมตีล่วงหน้าหรือการชนกันของข้อมูล นำเรื่องเล็ก ๆ น้อย ๆ ของการค้นหาผ่านครั้งแรกสำหรับไฟล์ที่ซ้ำกันใน HD ของคุณ

  • ใช้ฟังก์ชั่นที่ใช้ SHA2XX หากคุณต้องการฟังก์ชั่นแฮชที่เข้ารหัสลับ

ไม่มีใครเคยพบการปะทะกันของ SHA512 เคย. พวกเขาได้พยายามอย่างหนักจริงๆ สำหรับเรื่องนั้นไม่มีใครเคยพบการปะทะของ SHA256 หรือ 384 เลย .

  • อย่าใช้ SHA1 หรือ RIPEMD เว้นแต่ว่าจะเป็นสถานการณ์การทำงานร่วมกัน

RIPMED ไม่ได้รับการตรวจสอบจำนวนเดียวกันกับที่ SHAX และ MD5 ได้รับ ทั้ง SHA1 และ RIPEMD เสี่ยงต่อการโจมตีวันเกิด พวกเขาทั้งคู่ช้ากว่า MD5 บน. NET และมีขนาด 20 ไบต์ที่น่าอึดอัดใจ มันไม่มีประโยชน์ที่จะใช้ฟังก์ชั่นเหล่านี้ลืมเกี่ยวกับพวกมัน

การโจมตีของการปะทะกันของ SHA1 นั้นลดลงเหลือ 2 ^ 52 ซึ่งจะไม่นานเกินไปจนกว่าการปะทะของ SHA1 จะออกมาในป่า

สำหรับถึงวันที่ข้อมูลเกี่ยวกับฟังก์ชั่นต่างๆกัญชามีลักษณะที่สวนสัตว์ฟังก์ชันแฮช

แต่รอมีมากขึ้น

การมีฟังก์ชั่นแฮชอย่างรวดเร็วอาจเป็นการสาปแช่ง ตัวอย่างเช่นการใช้งานทั่วไปสำหรับฟังก์ชั่นแฮชคือการจัดเก็บรหัสผ่าน โดยพื้นฐานแล้วคุณคำนวณแฮชของรหัสผ่านรวมกับสตริงแบบสุ่มที่รู้จัก (เพื่อขัดขวางการโจมตีแบบสายรุ้ง) และเก็บแฮชนั้นในฐานข้อมูล

ปัญหาคือว่าถ้าผู้โจมตีได้รับการถ่ายโอนข้อมูลจากฐานข้อมูลเขาสามารถเดารหัสผ่านได้อย่างมีประสิทธิภาพโดยใช้แรงเดรัจฉาน ชุดค่าผสมทุกชุดที่เขาลองใช้นั้นใช้เวลาเพียงเสี้ยววินาทีและเขาสามารถลองใช้รหัสผ่านนับแสนครั้งต่อวินาที

ในการแก้ไขปัญหานี้สามารถใช้อัลกอริทึมbcryptได้ซึ่งได้รับการออกแบบให้ช้าดังนั้นผู้โจมตีจะช้าลงอย่างมากหากโจมตีระบบโดยใช้ bcrypt เมื่อเร็ว ๆ นี้scryptได้ทำการพาดหัวบางส่วนและถูกพิจารณาโดยบางส่วนให้มีประสิทธิภาพมากกว่า bcrypt แต่ฉันไม่รู้ถึงการใช้. net


ในขณะที่ทั้ง MD5 และ SHA-1 อ่อนแอลง MD5 นั้นอ่อนแอกว่า SHA-1 มากในขณะที่เร็วกว่าเล็กน้อย การชนจริงของ MD5 นั้นถูกค้นพบและใช้สำหรับการหาประโยชน์ในโลกแห่งความเป็นจริง (การปลอมแปลงใบรับรอง CA) แต่เท่าที่ฉันรู้ว่าไม่พบการปะทะกันของ SHA-1 จริง (แม้ว่าจำนวนการปฏิบัติการจะลดลงอย่างมากจากแรงเดรัจฉาน) และเมื่อพิจารณาว่า MD5 ที่อ่อนแอกว่านั้นคืออะไรฉันจะไม่แปลกใจถ้าการโจมตีโดย preimage ครั้งที่สองปรากฏขึ้นสำหรับ MD5 เร็วกว่า SHA-1 ดังนั้นฉันคิดว่าคุณควรใช้ SHA-1 หากคุณต้องการความเร็วและไม่ต้านทานการชนและใช้อย่างใดอย่างหนึ่งในตระกูล SHA-2
Brian Campbell

1
@Brian ค่อนข้างชัดเจนว่าในอีกไม่กี่ปีข้างหน้าผู้คนจะสามารถเรียกใช้การโจมตีการชนกันของ SHA1 ได้อย่างมีประสิทธิภาพซึ่งจะทำให้ SHA1 มีประโยชน์เช่นเดียวกับ MD5 สิ่งที่ใบรับรอง CA เป็นการโจมตีที่มีการปะทะกันในอีกไม่กี่ปีข้างหน้า เพื่อเรียกใช้การโจมตีเดียวกันกับใบรับรอง SHA1 CA การโจมตีขึ้นอยู่กับบุคคลที่เป็นอันตรายที่สร้าง EVIL และใบรับรองที่ดี ไม่มีการโจมตี Primage ที่รู้จักใน MD5 และความจริงที่ว่ามีการโจมตีจากการชนกันไม่ได้ทำให้เกิดการโจมตีก่อนภาพมากหรือน้อย
Sam Saffron

มันน้อยกว่าที่แฮชที่คุณใช้สำหรับรหัสผ่านมากกว่าสิ่งที่แฮช หากความรู้ของคุณเป็นที่รู้จักจากนั้นฐานข้อมูลของคุณจะเสี่ยงต่อการถูกโจมตีจากพจนานุกรมทันที ถ้าความเค็มของคุณเป็นขั้นตอนและระบบไฟล์ของคุณถูกบุกรุกคุณก็จะอ่อนแออีกครั้ง ถ้าเกลือของคุณถูกละไว้คุณจะถูกประนีประนอมอีกครั้ง ความปลอดภัยที่เป็นปัญหาไม่ว่าอะไรจะเกิดอะไรขึ้น ใบรับรองฉันจะไม่พูดเพราะฉันไม่ได้จัดการกับพวกเขาในฐานะโปรแกรมเมอร์ (IE, การสร้าง, การทำความเข้าใจ ฯลฯ )
Robert K

คำที่แตกออกมีความหมายเฉพาะในบริบทของการขัดเกลาและไม่ใช่ความหมายที่คำตอบนี้ให้ความสำคัญ คำตอบทั้งหมดนี้จะทำให้เกิดความสับสน
Joel McBeth

1
นี่คือคำตอบที่ยอดเยี่ยมเพราะมันมุ่งเน้นไปที่การปฏิบัติจริง แฮชใช้สำหรับสิ่งอื่นที่ไม่ใช่ความปลอดภัย (เช่นการสร้างคีย์การค้นหาแคชสำหรับข้อมูลที่ไม่ไวต่อความรู้สึกหรือพิจารณาว่ามีการเปลี่ยนแปลงวัตถุที่เป็นอนุกรมหรือไม่) โอกาสในการโจมตีเป้าหมายเป็นศูนย์แทบไม่เคยบอกเลยและถึงแม้ว่าการโจมตีจะสำเร็จก็จะไม่มีผลกระทบใด ๆ งานที่ยอดเยี่ยมมุ่งเน้นไปที่ผลกระทบในทางปฏิบัติ (แทนที่จะเป็นทางทฤษฎี)
DVK

35

ปรับปรุง:

เวลาเปลี่ยนไปเรามีผู้ชนะ SHA3 ฉันอยากจะแนะนำให้ใช้ผู้ชนะkeccak (aka SHA3 ) ของการประกวด SHA3

คำตอบเดิม:

เพื่อที่อ่อนแอที่สุดถึงแข็งแกร่งฉันจะพูดว่า:

  1. RIPEMD BROKEN, ไม่ควรใช้อย่างที่เห็นใน pdf นี้
  2. MD-5 BROKEN, ไม่ควรใช้งานสามารถใช้งานได้ใน 2 นาทีกับแล็ปท็อป
  3. SHA-1 BROKEN, ไม่ควรถูกใช้งาน, ถูกทำลายในหลักการ, การโจมตีเริ่มดีขึ้นในสัปดาห์
  4. อ่อนแอ SHA-2 อาจจะถูกทำลายในอีกไม่กี่ปีข้างหน้า พบจุดอ่อนเล็กน้อย โปรดทราบว่าโดยทั่วไปขนาดของคีย์ที่สูงกว่ายิ่งฟังก์ชั่นแฮชยิ่งยาก ในขณะที่ขนาดของคีย์ = ความแข็งแกร่งไม่ได้เป็นจริงเสมอไป แต่ส่วนใหญ่เป็นความจริง ดังนั้น SHA-256 น่าจะอ่อนแอกว่า SHA-512
  5. เข็ดไม่พบจุดอ่อนที่รู้จักกันเป็นผู้สมัครสำหรับ SHA-3 มันค่อนข้างใหม่และยังไม่ทดลอง มันถูกนำมาใช้ในหลายภาษา
  6. MD6 ไม่รู้จักความอ่อนแอเป็นอีกทางเลือกหนึ่งสำหรับ SHA-3 น่าจะแข็งแกร่งกว่า Skien แต่ช้ากว่าในเครื่องคอร์เดี่ยว เช่นเดียวกับสเกียนมันไม่ได้ทดสอบ บางการรักษาความปลอดภัยนักพัฒนาใจจะใช้มันในบทบาทภารกิจสำคัญ

โดยส่วนตัวแล้วฉันจะใช้ MD6 เพราะไม่มีใครหวาดระแวงเกินไป ถ้าความเร็วเป็นเรื่องจริงฉันจะดู Skein หรือ SHA-256


5
ฉันจะไม่ทำให้ Skein และ MD6 นั้นสูงที่สุดในรายการ มีเหตุผลว่าการแข่งขัน SHA-3 จะไม่เสร็จสิ้นไปจนถึงสิ้นปี 2555 มันใช้เวลานานและมีตาจำนวนมากที่จะเชื่อว่าฟังก์ชั่นแฮชนั้นมีความปลอดภัยและไม่มีฟังก์ชั่นเหล่านี้ มีมานานพอแล้วสำหรับสิ่งนั้น
Eric Burnett

ฉันเห็นด้วยกับความรู้สึกของคุณ แต่ฉันคิดว่าชุมชนอยู่ในตำแหน่งที่แปลก ฟังก์ชั่นแฮชทั้งหมดที่ใช้งานอยู่ใกล้กับการถูกทำลาย (อาจจะไม่ใช่ SHA2 256-512) และเรายังต้องรอถึงปี 2012 เพื่อเลือกการเปลี่ยน เลือกพิษของคุณ: อ่อนแอ / แตกหักหรือยังไม่ทดลอง (ผู้สมัคร NIST ส่วนใหญ่ไม่ได้เปิดเผยต่อสาธารณชนนานกว่า 6 เดือน)? ทางเลือกที่ยากลำบาก
Ethan Heilman

5
RIPEMD เสีย แต่ RIPEMD-128/160/256 นั้นแตกต่างกันและไม่แตก
Bwooce

ฉันไม่ได้ตระหนักถึงการใช้งาน Skein สำหรับ. NET ฉันเจอ SkeinFish และ nskein และทั้งคู่ก็ช้ามาก
Cocowalla

1
ฉันจะรอด้วยการใช้ SHA-3 จนกว่ามาตรฐานจริงจะอยู่ที่นั่นอย่างน้อยถ้าคุณต้องการที่จะปฏิบัติตามมาตรฐานจริง อัลกอริทึมนั้นมีตัวเลือกมากเกินไป
Paŭlo Ebermann

3

ในการป้องกันของ MD5 นั้นไม่มีทางรู้ว่าจะสร้างไฟล์ที่มีแฮช MD5 ตามอำเภอใจได้ ผู้เขียนต้นฉบับจะต้องวางแผนล่วงหน้าเพื่อให้มีการชนกันของข้อมูล ดังนั้นถ้าผู้รับเชื่อใจผู้ส่ง MD5 ก็ดี MD5 ใช้งานไม่ได้หากผู้ลงนามเป็นอันตราย แต่ไม่ทราบว่ามีความเสี่ยงที่จะถูกโจมตีจากคนกลาง


1
แม้ว่าฉันจะไม่เป็นผู้เชี่ยวชาญในสาขานี้ แต่ก็เป็นไปได้หรือไม่ที่จะคำนวณ MD5 แฮชโดยพลการในปัจจุบัน?
mafu

@mafu: การตอบสนองที่ล่าช้าที่นี่ แต่ก็เป็นไปได้ที่จะคำนวณการแฮชผ่านกำลังดุร้าย อาจใช้เวลานานมาก
Warty

@ ItzWarty ฉันอ้างถึงเวลาที่ต้องการโดยเฉพาะ - เนื่องจาก MD5 ค่อนข้างสั้นฉันจึงคิดว่ามันอาจเป็นไปได้ที่จะโยนแหล่งคำนวณที่เหมาะสมในนั้น (E3 หรือกริดคอมพิวเตอร์ราคาถูกไม่กี่เครื่องที่มีการ์ดกราฟิกบางอย่าง ตามบรรทัดเหล่านั้น) และสามารถคำนวณแฮช MD5 ภายในเวลาไม่กี่วัน
mafu

@mafu การโจมตีแบบพรี - อิมเมจราคา 2 ^ 127 การเรียกใช้แฮชสำหรับแฮช 128 บิต สิ่งนี้อยู่ไกลจากความเป็นไปได้ การเรียกใช้ 2 ^ 80 เป็นไปได้ แต่มีราคาแพงมาก
CodesInChaos

2

สิ่งที่คุณใช้จริง ๆ ขึ้นอยู่กับสิ่งที่คุณใช้สำหรับ หากคุณต้องการให้แน่ใจว่าไฟล์จะไม่ได้รับความเสียหายในระหว่างการขนส่งและไม่เกี่ยวข้องกับความปลอดภัยให้ดำเนินการอย่างรวดเร็วและเล็ก หากคุณต้องการลายเซ็นดิจิทัลสำหรับข้อตกลงการช่วยเหลือจากรัฐบาลกลางมูลค่าหลายพันล้านดอลลาร์และจำเป็นต้องทำให้แน่ใจว่าพวกเขาไม่ได้ถูกปลอมแปลงให้ทำการปลอมแปลงและชะลอตัว


1
หลายครั้งที่พูดถึงวิธีแก้ปัญหาฉันพูดถึงว่าฉันใช้ MD5 เพื่อระบุตัวตนอย่างรวดเร็ว (hashing a string) พวกเขาพูดว่า "แต่ md5 นั้นใช้งานไม่ได้ ... อย่าใช้มันใช้ sha1" ... ฉันไม่สมัครเลย ถ้ามีอะไรจะให้เสียลึกซึ้งกับบางส่วนของ hashs อ่อนแอที่พวกเขาควรจะหลีกเลี่ยง ... เช่นกรณีที่ผลงานจริงที่มีข้อมูลปกติผลิตชน
แซม Saffron

เมื่อเห็นว่า MD5 ทำงานได้ดีสำหรับผู้คนหลายล้านคนเป็นเวลาสิบห้าปีฉันคิดว่ามันโอเคสำหรับคุณถ้าความปลอดภัยของแฮชไม่สำคัญ
mqp

2
@sambo MD5 ทำงานได้ดีในเกือบทุกกรณียกเว้นเมื่อความปลอดภัย / ความสมบูรณ์ของระบบขึ้นอยู่กับการป้องกันการชน
Rex M

2

ฉันต้องการที่จะพูดสอดใน (ก่อนที่ md5 จะถูกแยกออกจากกัน) ที่ฉันยังคงใช้ md5 อย่างกว้างขวางแม้จะมีความเสียหายอย่างท่วมท้นสำหรับ crypto จำนวนมาก

ตราบใดที่คุณไม่สนใจที่จะป้องกันการชน (คุณยังคงปลอดภัยที่จะใช้ md5 ใน hmac เช่นกัน) และคุณต้องการความเร็ว (บางครั้งคุณต้องการแฮชที่ช้ากว่า) จากนั้นคุณยังสามารถใช้ md5 ได้อย่างมั่นใจ


@ ไมค์ฉันอยู่กับคุณนั่นเป็นสิ่งที่ฉันกำลังขุดหาด้วยคำถามนี้มันเป็นอะไรบางอย่างเกี่ยวกับฟังก์ชั่นแฮ็กที่อ่อนแอกว่าดังนั้นพื้นฐานที่แตกสลายซึ่งพวกเขาไม่ควรใช้
Sam Saffron

นอกจากนี้หากข้อมูลหรือความปลอดภัยที่ต้องการของข้อมูลมีอายุสั้นกว่าช่วงเวลาแตก (ไม่กี่นาทีในวันนี้ iirc) MD5 นั้นใช้ได้จริง สถานการณ์มีประโยชน์ แต่ก็ยังมีประโยชน์คือประเด็น
annakata

@annakata - โปรดทราบว่าคุณจะต้องหลีกเลี่ยงการใช้คีย์ซ้ำในหลาย ๆ ข้อความเพื่อให้สามารถใช้งานได้ภายใต้สถานการณ์เหล่านั้น
Steve Westbrook

2

มันจะเป็นความคิดที่ดีที่จะดูBLAKE2 algorythm

ตามที่อธิบายไว้มันเร็วกว่า MD5 และอย่างน้อยก็ปลอดภัยเท่ากับ SHA-3 มันถูกใช้งานโดยแอพพลิเคชั่นซอฟต์แวร์ต่างๆ รวมถึง WinRar


มันอาจเร็วกว่ายกเว้นการใช้งานหลายอย่างมีการสนับสนุนฮาร์ดแวร์ซึ่งทำให้ SHA-256 ค่อนข้างเร็ว
zaph

ฉันเห็นด้วย. ตั้งแต่ปี 2019 Blake2b เป็นแฮชวัตถุประสงค์ทั่วไปที่ดีที่สุดจนถึงปัจจุบัน เร็วกว่าทางเลือกอื่น ๆ ทั้งหมดและไม่ปลอดภัยน้อยกว่า (ไม่มีความหมายใด ๆ อย่างน้อย) และสามารถประมวลผลได้ใน ram เพียง 336 ไบต์ (168 สำหรับ blake2s) โอ้และมันเหมาะสำหรับซีพียูน้อย endian ซึ่งเป็น endian ที่โดดเด่นในระบบปัจจุบัน
hanshenrik

0

ฉันไม่ได้เป็นผู้เชี่ยวชาญในเรื่องแบบนี้ แต่ฉันทามติกับชุมชนด้านความปลอดภัยและผู้คนจำนวนมากที่คิดว่าแฮช md5 เสีย ฉันจะบอกว่าจะใช้อันไหนขึ้นอยู่กับความละเอียดอ่อนของข้อมูลและแอพพลิเคชั่นที่เฉพาะเจาะจง คุณอาจจะสามารถหลีกเลี่ยงแฮชที่มีความปลอดภัยน้อยลงเล็กน้อยได้ตราบใดที่กุญแจนั้นดีและแข็งแรง


1
ฟังก์ชั่นแฮชมักจะไม่ใช้คีย์
Ethan Heilman

0

นี่คือคำแนะนำของฉันสำหรับคุณ:

  1. คุณน่าจะลืม MD5 ได้หากคาดว่าจะมีการโจมตี มีตารางสายรุ้งจำนวนมากสำหรับพวกเขาออนไลน์และ บริษัท ต่างๆเช่น RIAA นั้นเป็นที่รู้จักกันว่าสามารถผลิตลำดับที่มีแฮชที่เท่าเทียมกัน
  2. ใช้เกลือถ้าคุณสามารถ การรวมความยาวของข้อความในข้อความอาจทำให้การแฮชชนมีประโยชน์ได้ยากมาก
  3. ตามกฎทั่วไปของหัวแม่มือบิตที่มากขึ้นหมายถึงการชนที่น้อยลง (โดยหลักการของ pigeonhole) และช้ากว่าและอาจปลอดภัยกว่า (เว้นแต่คุณจะเป็นอัจฉริยะทางคณิตศาสตร์ที่สามารถค้นหาจุดอ่อนได้)

ดูที่นี่สำหรับกระดาษที่ให้รายละเอียดอัลกอริทึมเพื่อสร้างการชนกันของ md5 ใน 31 วินาทีด้วยคอมพิวเตอร์เดสก์ท็อป Intel P4

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


ความคิดเห็นนี้เก่ามากและดูเหมือนจะถูกฝังอยู่ แต่บิตนี้ - RIAA เป็นที่รู้กันว่าสามารถสร้างลำดับที่มีแฮชที่เท่าเทียมกัน - กระโดดออกมาที่ฉันและฉันอยากรู้ว่าบริบทของเรื่องนี้คืออะไร โดยเฉพาะอย่างยิ่ง bruteforcing MD5 เมื่อ 8 ปีที่แล้วค่อนข้างน้อยกว่าในปี 2560 ดังนั้นพวกเขาจะต้องมีเหตุผลที่ดี
i336_
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.