ข้ามไปยังเนื้อหา

ฟังก์ชันแฮชเชิงเข้ารหัส

คู่มือฟังก์ชันแฮชเชิงเข้ารหัสที่เน้นการตรวจสอบ ครอบคลุมคุณสมบัติด้านความปลอดภัย การเข้ารหัสไบต์ SHA-2, SHA-3, Keccak การใช้งานในบล็อกเชน และความเสี่ยงในการนำไปใช้

อัปเดต

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

คำตอบโดยตรง

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

h = H(m), where h is in {0,1}^n

ไบต์และอัลกอริทึมเดียวกันจะให้ไดเจสต์เดียวกัน การเปลี่ยนอินพุตเพียงหนึ่งบิตควรทำให้บิตเอาต์พุตจำนวนมากเปลี่ยนไปอย่างคาดเดาไม่ได้ แต่ปรากฏการณ์ avalanche นี้ไม่ใช่นิยามของความปลอดภัย เป้าหมายหลักด้านความปลอดภัย ได้แก่ ความต้านทานการย้อนหาข้อมูลต้นฉบับ (เมื่อทราบไดเจสต์แล้ว การหาอินพุตที่สร้างไดเจสต์นั้นต้องทำไม่ได้ในทางปฏิบัติ), ความต้านทานการหาข้อมูลต้นฉบับชุดที่สอง (เมื่อทราบอินพุตหนึ่งชุดแล้ว การหาอินพุตอีกชุดที่ให้ไดเจสต์เดียวกันต้องทำไม่ได้ในทางปฏิบัติ) และ ความต้านทานการชนกัน (การหาอินพุตต่างกันสองชุดใด ๆ ที่ให้ไดเจสต์เดียวกันต้องทำไม่ได้ในทางปฏิบัติ)

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

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

วิธีการทำงาน

  1. กำหนดไบต์ให้แน่นอน. การเข้ารหัสข้อความ ตัวพิมพ์ใหญ่และเล็ก ช่องว่าง ลำดับฟิลด์ การแทนจำนวนเต็ม คำนำหน้าความยาว และการทำ serialization ล้วนส่งผลต่อ m โปรโตคอลต้องกำหนดการเข้ารหัสแบบมาตรฐานและผูกแฮชไว้กับอัลกอริทึม เวอร์ชัน เครือข่าย และวัตถุประสงค์ที่ชัดเจน
  2. ใช้โครงสร้างที่ระบุ. SHA-256 จะประมวลผลข้อความที่มีความยาวจำกัดล่วงหน้า แบ่งเป็นบล็อก และอัปเดตสถานะภายในซ้ำ ๆ ส่วน SHA3-256 ใช้โครงสร้าง sponge ที่สร้างจาก KECCAK ทั้งสองให้ไดเจสต์ 256 บิต แต่เป็นคนละฟังก์ชันและใช้เอาต์พุตแทนกันไม่ได้
  3. ตีความความปลอดภัยตามคุณสมบัติที่ต้องการ. สำหรับแฮช n บิตในอุดมคติ การค้นหาข้อมูลต้นฉบับแบบทั่วไปใช้การประเมินประมาณ 2^n ครั้ง ขณะที่การค้นหาการชนกันแบบทั่วไปใช้ประมาณ 2^(n/2) ครั้งเนื่องจาก birthday effect ความยาวเอาต์พุตเพียงอย่างเดียวไม่เพียงพอ หากอัลกอริทึมถูกเจาะ ไดเจสต์ถูกตัดทอน หรือโปรโตคอลรอบข้างมีข้อบกพร่อง
  4. สร้างโปรโตคอลรอบไดเจสต์. ระบบลายเซ็นดิจิทัลสามารถลงนามไดเจสต์ของข้อความได้ HMAC เพิ่มคีย์ลับเพื่อยืนยันความถูกต้องของข้อความ ต้นไม้ Merkle ผูกมัดใบจำนวนมากไว้ด้วย root เดียว และ proof-of-work แฮชส่วนหัวบล็อกที่เป็นตัวเลือกซ้ำ ๆ จนกว่าไดเจสต์จะตรงตามเป้าหมาย โครงสร้างเหล่านี้ให้หลักประกันที่ต่างกัน
  5. ใช้ฟังก์ชันที่ตรงกับเชนนั้น. ส่วนหัวบล็อกและโหนด Merkle ของ Bitcoin ใช้ SHA-256 สองรอบตามลำดับไบต์ที่กำหนด การประมวลผลของ Ethereum ใช้ Keccak-256 จากแบบ KECCAK ก่อนการกำหนดมาตรฐาน ไม่ใช่ SHA3-256 ตามมาตรฐาน ดังนั้นป้ายกำกับอย่าง “แฮช 256 บิต” จึงไม่เพียงพอสำหรับการตรวจสอบ
  6. ตรวจสอบบริบทก่อนตีความความหมาย. ตรวจสอบแหล่งที่มาของไดเจสต์ที่คาดไว้ ตัวระบุอัลกอริทึม การเข้ารหัสไบต์ โดเมนหรือเชน จุดอ้างอิงบล็อกและสถานะ สถานะการยืนยัน และการตัดทอนใด ๆ การคำนวณที่ถูกต้องกับบริบทที่ผิดยังคงเป็นการตรวจสอบที่ล้มเหลว

ตัวอย่างพร้อมคำอธิบาย

  • การเปลี่ยนอินพุตเพียงเล็กน้อย. SHA-256 ของไบต์ UTF-8 ห้าไบต์สำหรับ hello คือ 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 เมื่อเปลี่ยนไบต์แรกเป็นตัวพิมพ์ใหญ่ H จะได้ 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969 ไดเจสต์ที่ต่างกันไม่เผยว่าไบต์ใดถูกเปลี่ยน
  • ระดับความปลอดภัยไม่เท่ากับความยาวไดเจสต์ในทุกแบบจำลองการโจมตี. แฮช 256 บิตในอุดมคติให้ภาระงานในการย้อนหาข้อมูลต้นฉบับประมาณ 2^256 แต่ภาระงานในการหาการชนกันอยู่ที่ 2^128 ความแตกต่างนี้สำคัญเมื่อโปรโตคอลพึ่งพาความต้านทานการชนกัน เช่น กระบวนการลายเซ็นดิจิทัลที่มักเป็นเช่นนั้น
  • หลักฐาน Merkle ยืนยันการรวมข้อมูลโดยอิงกับ root หนึ่งค่า. ผู้ตรวจสอบจะแฮชใบที่เข้ารหัสแล้วกับ sibling แต่ละค่าที่ได้รับตามลำดับที่ระบุ จนสร้าง root ที่ผูกมัดไว้ขึ้นมาใหม่ การตรงกันไม่ได้พิสูจน์ว่า root มีความสมบูรณ์เด็ดขาด ข้อมูลในใบเป็นความจริง หรือข้อมูลที่ละไว้พร้อมใช้งาน
  • Proof-of-work เพิ่มกฎของค่าเป้าหมาย. Bitcoin จะยอมรับส่วนหัวที่เป็นตัวเลือกก็ต่อเมื่อค่า SHA-256 สองรอบของมัน เมื่อตีความตามกฎฉันทามติแล้ว น้อยกว่าหรือเท่ากับเป้าหมายที่เข้ารหัสไว้ ไดเจสต์ไม่ได้ต้านทานการชนกันมากขึ้นเพียงเพราะนักขุดใช้กำลังประมวลผลมากขึ้น

ความเสี่ยง

  • ใช้อัลกอริทึมที่เลิกใช้แล้วหรือไม่เหมาะสม โดยเฉพาะการพึ่งพา SHA-1 ในกรณีที่ต้องการความต้านทานการชนกัน
  • ถือว่า SHA3-256, Keccak-256, SHA-256, SHA-256 สองรอบ และรูปแบบที่ตัดทอนต่างกันสามารถใช้แทนกันได้
  • แฮชข้อความที่แสดงแทนไบต์มาตรฐาน หรือมองข้ามการทำ Unicode normalization ช่องว่าง endianness ลำดับฟิลด์ และการเข้ารหัสความยาว
  • ดาวน์โหลดไฟล์และไดเจสต์ที่คาดไว้จากแหล่งเดียวกันที่ถูกเจาะ ซึ่งไม่ทำให้เกิดการตรวจสอบความสมบูรณ์ที่เป็นอิสระ
  • ใช้แฮชอเนกประสงค์ที่รวดเร็วโดยตรงเพื่อเก็บรหัสผ่าน แทนระบบแฮชรหัสผ่านที่ใส่ salt ออกแบบมาเฉพาะ และมี work factor ที่เหมาะสม
  • ใช้ H(secret || message) เป็นรหัสยืนยันความถูกต้องที่ทำขึ้นเอง โครงสร้างแฮชแบบวนซ้ำบางชนิดเปิดให้โจมตีด้วยการต่อความยาวได้ ขณะที่ HMAC ออกแบบมาสำหรับการยืนยันด้วยคีย์
  • ตัดทอนไดเจสต์โดยไม่คำนวณระดับความปลอดภัยต่อการชนกันและการย้อนหาข้อมูลต้นฉบับที่เหลืออยู่ตามขนาดและแบบจำลองภัยคุกคามของโปรโตคอล
  • ใช้การเข้ารหัสเดียวกันข้ามโปรโตคอลโดยไม่มีการแยกโดเมน ทำให้ไดเจสต์ที่ใช้ได้ในบริบทหนึ่งถูกตีความในอีกบริบทหนึ่ง
  • สันนิษฐานว่าแฮชธุรกรรมพิสูจน์การยืนยัน ความสมบูรณ์เด็ดขาด การดำเนินการสำเร็จ ความเป็นเจ้าของ หรือการปลอดจากการจัดระเบียบเชนใหม่
  • สันนิษฐานว่าแฮชเนื้อหาทำให้เรียกคืนข้อมูลที่อ้างถึงได้ ข้อผูกมัดอาจยังถูกต้องแม้สำเนาที่มีอยู่ทั้งหมดจะหายไป
  • เปรียบเทียบสตริงใน explorer โดยไม่ตรวจสอบลำดับไบต์ กฎคำนำหน้า serialization หรือว่าอินเทอร์เฟซแสดงตัวระบุภายในต่างออกไปหรือไม่
  • นำ primitive ทางวิทยาการเข้ารหัสไปใช้โดยไม่มีเวกเตอร์ทดสอบมาตรฐาน ไลบรารีที่ได้รับการดูแล การตรวจสอบโดยอิสระ และกระบวนการอัปเกรด

ความเข้าใจผิดที่พบบ่อย

  • แฮชคือข้อมูลที่เข้ารหัสลับ. การเข้ารหัสลับย้อนกลับได้ด้วยคีย์ที่ถูกต้อง ส่วนแฮชเชิงเข้ารหัสคือไดเจสต์ทางเดียวที่ไม่มีการถอดรหัส
  • อินพุตต่างกันไม่มีทางให้ไดเจสต์เดียวกัน. การชนกันต้องมีอยู่สำหรับเอาต์พุตความยาวคงที่ การออกแบบที่ปลอดภัยทำให้การค้นหาและใช้ประโยชน์จากมันทำไม่ได้ในทางปฏิบัติ
  • ไดเจสต์ 256 บิตให้ความปลอดภัย 256 บิตเสมอ. ความต้านทานการชนกันแบบทั่วไปของแฮช 256 บิตในอุดมคติอยู่ที่ประมาณ 128 บิต และการเลือกออกแบบโปรโตคอลอาจลดลงไปอีก
  • แฮชที่ตรงกันพิสูจน์ว่าใครสร้างข้อความ. แฮชเปล่าไม่มีข้อมูลลับและไม่ยืนยันผู้ส่ง หากที่มามีความสำคัญ ให้ใช้ลายเซ็นหรือ MAC ที่เหมาะสม
  • Keccak-256 และ SHA3-256 เป็นสองชื่อของฟังก์ชันเดียวกัน. ทั้งคู่ใช้การออกแบบที่สัมพันธ์กันอย่างใกล้ชิด แต่พารามิเตอร์มาตรฐานต่างกันและให้ไดเจสต์ต่างกัน
  • แฮชธุรกรรมบนเชนพิสูจน์การชำระเสร็จสิ้น. แฮชระบุข้อมูลธุรกรรมที่เข้ารหัสไว้ ส่วนการรวมเข้าเชน สถานะการดำเนินการ การยืนยัน และความสมบูรณ์เด็ดขาดเป็นข้อเท็จจริงคนละเรื่อง

หัวข้อที่เกี่ยวข้อง

แหล่งข้อมูล

การนำทาง

ค้นหาในวิกิ...