การแฮชไฟล์ ฟังก์ชันแฮชที่เข้ารหัส

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

มันคืออะไร?

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

ลักษณะเฉพาะ

พิจารณาลักษณะสำคัญของอัลกอริทึมที่กำลังศึกษาอยู่ ในหมู่พวกเขา:

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

คุณสมบัติที่สำคัญอื่นๆ ของฟังก์ชันแฮช ได้แก่:

  • ความสามารถในการประมวลผลอาร์เรย์ข้อมูลเริ่มต้นที่มีความยาวตามต้องการ
  • สร้างบล็อกแฮชที่มีความยาวคงที่
  • กระจายค่าฟังก์ชันที่เอาต์พุตเท่าๆ กัน

อัลกอริธึมที่พิจารณายังถือว่ามีความไวต่อการป้อนข้อมูลในระดับ 1 บิต นั่นคือถึงแม้ว่าจะมีการเปลี่ยนแปลงตัวอักษรอย่างน้อย 1 ตัวในเอกสารต้นฉบับ แต่ฟังก์ชันแฮชก็จะดูแตกต่างออกไป

ข้อกำหนดสำหรับฟังก์ชันแฮช

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

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

โครงสร้าง

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

ฟังก์ชันแฮชที่ใช้เพื่อวัตถุประสงค์ดังกล่าวสามารถแสดงได้ในโครงสร้างใด ตัวอย่างขององค์ประกอบอาจเป็นดังนี้: H (แฮชนั่นคือแฮช) = f (T (ข้อความ), H1) โดยที่ H1 คืออัลกอริธึมการประมวลผลข้อความ T ฟังก์ชันนี้แฮช T ในลักษณะที่ไม่มีความรู้ ของ H1 สามารถเปิดได้เป็นไฟล์เดียวแทบจะเป็นไปไม่ได้เลย

การใช้ฟังก์ชันแฮชในทางปฏิบัติ: การดาวน์โหลดไฟล์

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

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

ฟังก์ชั่นแฮชและลายเซ็นดิจิทัล

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

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

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

กำลังตรวจสอบรหัสผ่าน

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

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

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

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

การชนกันของฟังก์ชันแฮช

ทฤษฎีฟังก์ชันแฮชจัดให้มีปรากฏการณ์เช่นการชนกัน สาระสำคัญของมันคืออะไร? การชนกันของแฮชคือสถานการณ์ที่ไฟล์สองไฟล์ที่แตกต่างกันมีรหัสแฮชเดียวกัน สิ่งนี้เป็นไปได้หากความยาวของลำดับอักขระเป้าหมายมีขนาดเล็ก ในกรณีนี้ ความน่าจะเป็นของการจับคู่แฮชจะสูงกว่า

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

ประวัติความเป็นมาของการปรากฏตัว

ผู้ก่อตั้งทฤษฎีฟังก์ชันแฮชถือได้ว่าเป็นนักวิจัย Carter, Wegman, Simonson และ Bierbrauer ในเวอร์ชันแรก อัลกอริธึมที่เกี่ยวข้องถูกใช้เป็นเครื่องมือในการสร้างภาพพิเศษของลำดับอักขระที่มีความยาวตามใจชอบ โดยมีวัตถุประสงค์ในภายหลังเพื่อระบุและตรวจสอบความถูกต้อง ในทางกลับกัน แฮชต้องมีความยาว 30-512 บิตตามเกณฑ์ที่กำหนด คุณสมบัติที่เป็นประโยชน์อย่างยิ่งของฟังก์ชันที่เกี่ยวข้องนั้นถือเป็นความเหมาะสมสำหรับการใช้เป็นทรัพยากรสำหรับการค้นหาไฟล์หรือจัดเรียงไฟล์อย่างรวดเร็ว

มาตรฐานแฮชยอดนิยม

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

ในทางกลับกัน มาตรฐาน MD4 และ MD5 ถูกนำมาใช้กันอย่างแพร่หลายในการเข้ารหัส อัลกอริธึมการเข้ารหัสยอดนิยมอีกอย่างหนึ่งคือ SHA-1 โดยเฉพาะอย่างยิ่งมันมีลักษณะเฉพาะด้วยขนาดแฮช 160 บิต ซึ่งใหญ่กว่า MD5 - มาตรฐานนี้รองรับ 128 บิต มีมาตรฐานของรัสเซียที่ควบคุมการใช้ฟังก์ชันแฮช - GOST R 34.11-94 รวมถึง GOST R 34.11-2012 ซึ่งแทนที่ สามารถสังเกตได้ว่าค่าแฮชที่ได้รับจากอัลกอริธึมที่ใช้ในสหพันธรัฐรัสเซียคือ 256 บิต

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

คุณสมบัติของอัลกอริทึม SHA

การใช้ฟังก์ชันแฮชตามมาตรฐาน SHA มักดำเนินการในการพัฒนาเครื่องมือลายเซ็นดิจิทัลสำหรับเอกสาร DSA ดังที่เราได้กล่าวไว้ข้างต้น อัลกอริธึม SHA รองรับแฮช 160 บิต (จัดให้มีสิ่งที่เรียกว่า "ไดเจสต์" ของลำดับอักขระ) ในขั้นแรก มาตรฐานที่อยู่ระหว่างการพิจารณาจะแบ่งอาร์เรย์ข้อมูลออกเป็นบล็อกขนาด 512 บิต หากจำเป็น หากความยาวของบล็อกสุดท้ายไม่ถึงหลักที่ระบุ โครงสร้างไฟล์จะเสริมด้วย 1 และจำนวนศูนย์ที่ต้องการ นอกจากนี้ในตอนท้ายของบล็อกที่เกี่ยวข้องยังมีรหัสที่แก้ไขความยาวของข้อความ อัลกอริทึมที่อยู่ระหว่างการพิจารณาใช้ฟังก์ชันลอจิคัล 80 รายการ โดยประมวลผล 3 คำที่นำเสนอใน 32 บิต มาตรฐาน SHA ยังกำหนดให้ใช้ค่าคงที่ 4 ค่าด้วย

การเปรียบเทียบอัลกอริทึมการแฮช

เรามาศึกษาว่าคุณสมบัติของฟังก์ชันแฮชที่เกี่ยวข้องกับมาตรฐานต่างๆ มีความสัมพันธ์กันอย่างไร โดยใช้ตัวอย่างการเปรียบเทียบคุณลักษณะของมาตรฐานรัสเซีย GOST R 34.11-94 และ American SHA ที่เราตรวจสอบข้างต้น ประการแรกควรสังเกตว่าอัลกอริทึมที่พัฒนาขึ้นในสหพันธรัฐรัสเซียถือว่าการดำเนินการเข้ารหัส 4 รายการต่อ 1 รอบ เท่ากับ 128 รอบ ในทางกลับกัน ในระหว่าง 1 รอบ เมื่อใช้ SHA คาดว่าจะมีการคำนวณประมาณ 20 คำสั่ง ในขณะที่มีทั้งหมด 80 รอบ ดังนั้น การใช้ SHA จะทำให้สามารถประมวลผลข้อมูลต้นฉบับได้ 512 บิตภายใน 1 รอบ ในขณะที่มาตรฐานรัสเซียสามารถดำเนินการในวงจรข้อมูล 256 บิตได้

ข้อมูลเฉพาะของอัลกอริธึมรัสเซียล่าสุด

เราสังเกตข้างต้นว่ามาตรฐาน GOST R 34.11-94 ถูกแทนที่ด้วยมาตรฐานใหม่ - GOST R 34.11-2012 "Stribog" มาสำรวจรายละเอียดเฉพาะของมันกันดีกว่า

เมื่อใช้มาตรฐานนี้ ฟังก์ชันแฮชการเข้ารหัสสามารถนำไปใช้ได้ เช่นเดียวกับในกรณีของอัลกอริธึมที่กล่าวถึงข้างต้น อาจสังเกตว่ามาตรฐานรัสเซียล่าสุดรองรับบล็อกข้อมูลอินพุต 512 บิต ข้อดีหลักของ GOST R 34.11-2012:

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

ข้อดีที่ระบุไว้ของมาตรฐานการเข้ารหัสลับแบบใหม่ของรัสเซียทำให้สามารถใช้งานได้เมื่อจัดระเบียบการไหลของเอกสารที่ตรงตามเกณฑ์ที่เข้มงวดที่สุดที่กำหนดไว้ในบทบัญญัติของกฎหมายควบคุม

ข้อมูลเฉพาะของฟังก์ชันแฮชการเข้ารหัส

มาดูกันว่าประเภทของอัลกอริธึมที่เรากำลังสำรวจสามารถนำมาใช้ในด้านการเข้ารหัสได้อย่างไร ข้อกำหนดหลักสำหรับฟังก์ชันที่เกี่ยวข้องคือความต้านทานต่อการชน ซึ่งเราได้กล่าวไปแล้วข้างต้น นั่นคือไม่ควรสร้างค่าฟังก์ชันแฮชที่ซ้ำกันหากค่าเหล่านี้มีอยู่แล้วในโครงสร้างของอัลกอริทึมใกล้เคียง ฟังก์ชันการเข้ารหัสจะต้องเป็นไปตามเกณฑ์อื่นๆ ที่ระบุไว้ข้างต้นด้วย เห็นได้ชัดว่ามีความเป็นไปได้ทางทฤษฎีบางประการในการกู้คืนไฟล์ต้นฉบับตามแฮช โดยเฉพาะอย่างยิ่งหากมีเครื่องมือคำนวณที่ทรงพลัง อย่างไรก็ตาม สถานการณ์ดังกล่าวคาดว่าจะลดลงด้วยอัลกอริธึมการเข้ารหัสที่เชื่อถือได้ ดังนั้น การคำนวณฟังก์ชันแฮชจะเป็นเรื่องยากมากหากความแรงในการคำนวณสอดคล้องกับสูตร 2^(n/2)

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

แผนการทำซ้ำ

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

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

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

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

อัลกอริธึมบล็อก

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

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

การแฮช(บางครั้งการแฮช, การแฮชภาษาอังกฤษ) - การแปลงอาร์เรย์ข้อมูลอินพุตที่มีความยาวตามอำเภอใจให้เป็นสตริงเอาต์พุตที่มีความยาวคงที่ การเปลี่ยนแปลงดังกล่าวเรียกอีกอย่างว่า ฟังก์ชันแฮชหรือ ฟังก์ชันการบิด, อาร์เรย์อินพุต – ต้นแบบและผลลัพธ์ของการแปลงก็คือ แฮช, รหัสแฮช, รูปภาพแฮช, ลายนิ้วมือดิจิทัลหรือ สรุปข้อความ(สรุปข้อความภาษาอังกฤษ)

ฟังก์ชันแฮช– ฟังก์ชั่นที่คำนวณได้ง่ายซึ่งแปลงข้อความเริ่มต้นที่มีความยาวตามต้องการ (ภาพก่อนหน้า) ให้เป็นข้อความที่มีความยาวคงที่ (ภาพแฮช) ซึ่งไม่มีอัลกอริธึมการค้นหาการชนกันที่มีประสิทธิภาพ

การชนกันสำหรับฟังก์ชั่น ชม.เรียกว่าคู่คุณค่า x, y, x ≠ yเช่นนั้น ชั่วโมง(x) = ชั่วโมง(y)- ที่. ฟังก์ชันแฮชต้องมีคุณสมบัติดังต่อไปนี้:

สำหรับค่าที่กำหนด ชั่วโมง(x)ไม่สามารถหาค่าอาร์กิวเมนต์ได้ x- ฟังก์ชันแฮชดังกล่าวเรียกว่า ต่อเนื่องในแง่ของการรักษาหรือ ยืนหยัดในความหมายที่แข็งแกร่ง;

สำหรับการโต้แย้งที่กำหนด xไม่พบข้อโต้แย้งอื่น เช่นนั้น ชั่วโมง(x) = ชั่วโมง(y)- ฟังก์ชันแฮชดังกล่าวเรียกว่า แข็งแกร่งในแง่ของการคำนวณการชนกันหรือ ยืนหยัดในความหมายที่อ่อนแอ.

ในกรณีที่ค่าฟังก์ชันแฮชไม่เพียงขึ้นอยู่กับพรีอิมเมจเท่านั้น แต่ยังขึ้นอยู่กับคีย์ส่วนตัวด้วย ค่านี้เรียกว่า Message Authentication Code (MAC), Data Authentication Code (DAC) หรือ การแทรกเลียนแบบ.

ในทางปฏิบัติ ฟังก์ชันแฮชถูกใช้เพื่อวัตถุประสงค์ดังต่อไปนี้:

เพื่อเพิ่มความเร็วในการค้นหาข้อมูลในฐานข้อมูล

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

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

ขั้นตอนการคำนวณ (แผนภาพอัลกอริทึมมาตรฐาน) ของฟังก์ชันแฮชแสดงไว้ในรูปต่อไปนี้

มะเดื่อ 10.1. ขั้นตอนการคำนวณค่าแฮช

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

2) ในการเริ่มต้นขั้นตอนการแฮช จะมีการใช้ข้อความการซิงโครไนซ์ ใช่ 0.

3) ต้นแบบ เอ็กซ์แตกออกเป็น nบล็อก x ฉัน(i = 1 .. n) ความยาวคงที่ ปอนด์ซึ่งใช้ขั้นตอนการแฮชประเภทเดียวกัน ฉ(ฉัน ฉัน-1 , x ฉัน)ขึ้นอยู่กับผลการแฮชของบล็อกก่อนหน้า ใช่ ฉัน-1.

4) วิธีแฮช ชั่วโมง(T)ข้อความต้นฉบับ จะเป็นผลจากขั้นตอนการแฮช ใช่ได้รับหลังจากประมวลผลบล็อกสุดท้าย เอ็กซ์เอ็น.

10.2. เอ็มดี5

เอ็มดี5 Message Digest 5 เป็นอัลกอริธึมการแฮช 128 บิตที่พัฒนาโดยศาสตราจารย์ Ronald L. Rivest แห่งสถาบันเทคโนโลยีแมสซาชูเซตส์ (MIT) ในปี 1991 เป็น MD4 เวอร์ชันที่ได้รับการปรับปรุงความปลอดภัย

ด้านล่างนี้คืออัลกอริธึมการคำนวณแฮช

1. การปรับสมดุลการไหล

ในตอนท้ายของข้อความต้นฉบับความยาว เพิ่มหนึ่งบิตแล้วจำนวนศูนย์บิตที่ต้องการเพื่อให้ขนาดใหม่ ล"เทียบได้กับ 448 โมดูโล 512 (L 'mod 512 = 448) การเพิ่มศูนย์บิตจะดำเนินการแม้ว่าความยาวใหม่ซึ่งรวมถึงหนึ่งบิตนั้นสามารถเทียบเคียงได้กับ 448 แล้ว

2. การเพิ่มความยาวของข้อความ

การแสดงความยาวข้อมูลแบบ 64 บิต (จำนวนบิตในข้อความ) จะถูกผนวกเข้ากับข้อความที่แก้ไข เหล่านั้น. ความยาวข้อความ กลายเป็นผลคูณของ 512 (T mod 512 = 0) หากความยาวของข้อความต้นฉบับเกิน 2 64 - 1 ระบบจะเพิ่มเฉพาะ 64 บิตที่ต่ำกว่าเท่านั้น นอกจากนี้ สำหรับการแสดงความยาว 64 บิตที่ระบุ 32 บิตที่มีลำดับต่ำจะถูกเขียนก่อน ตามด้วย 32 บิตที่มีลำดับสูง

3. การเริ่มต้นบัฟเฟอร์

สำหรับการคำนวณ ตัวแปร 4 ตัว ตัวละ 32 บิตจะถูกเตรียมใช้งานและตั้งค่าเริ่มต้น (การแสดงเลขฐานสิบหก):

= 67 45 23 01;
บี= EF ซีดี AB 89;
= 98 บริติชแอร์เวย์ กระแสตรง FE;
ดี = 10 32 54 76.

ตัวแปรเหล่านี้จะเก็บผลลัพธ์ของการคำนวณขั้นกลาง สถานะเริ่มต้น เอบีซีดีเรียกว่าเวกเตอร์การเริ่มต้น

4. การคำนวณแฮชแบบวนซ้ำ

ข้อความต้นฉบับแบ่งออกเป็นบล็อก ยาว 512 บิต สำหรับแต่ละบล็อกในรอบ จะดำเนินการตามขั้นตอนที่แสดงในรูปที่ 10.2 ผลลัพธ์ของการประมวลผลบล็อกทั้งหมดของข้อความต้นฉบับเป็นการรวมค่าตัวแปร 32 บิต เอบีซีดีและจะเป็นแฮช

มะเดื่อ 10.2. ขั้นตอนการคำนวณแฮชหลัก

ในแต่ละรอบจะมีตัวแปรมากกว่า เอบีซีดีและบล็อกข้อความต้นฉบับ ในรอบ (การวนซ้ำ 16 ครั้ง) การแปลงที่คล้ายกันจะดำเนินการตามรูปแบบต่อไปนี้

มะเดื่อ 10.3. การวนซ้ำหนึ่งรอบ

อนุสัญญา

1) รฟ- ฟังก์ชันแบบกลม กำหนดตามตารางต่อไปนี้

ตารางที่ 10.1. ฟังก์ชัน RF แบบกลม

2) ทีเจ- ส่วน j-th 32 บิตของบล็อกข้อความต้นฉบับ บิ๊กเอนเดียน;

3) โอเค- ส่วนจำนวนเต็มของค่าคงที่ที่กำหนดโดยสูตร

กี่ = 2 32 * | บาป(i + 16 * (r - 1)) |, (10.1)

โดยที่ i คือหมายเลขการวนซ้ำ (i = 1..16)
r – ตัวเลขกลม (r = 1..4)

อาร์กิวเมนต์ของฟังก์ชัน sin วัดเป็นเรเดียน

4) ⊞ – นอกจากนี้โมดูโล 2 32

5) <<< ฉัน– วงจรเลื่อนไปทางซ้ายด้วยตัวเลข s i

ใช้ส่วน 32 บิตของบล็อกข้อความต้นฉบับ ทีเจและจำนวนกะซ้ายแบบวน ฉันขึ้นอยู่กับหมายเลขการวนซ้ำและแสดงไว้ในตารางต่อไปนี้

ตารางที่ 10.2. ปริมาณที่ใช้ในขั้นตอนรอบรอบ

หมายเลขการวนซ้ำ1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
รอบที่ 1ทีเจเสื้อ 1เสื้อ 2เสื้อ 3เสื้อ 4เสื้อ 5เสื้อ 6เสื้อ 7เสื้อ 8ที 9เสื้อ 10เสื้อ 11เสื้อ 12เสื้อ 13เสื้อ 14เสื้อ 15เสื้อ 16
ฉัน7 12 17 22 7 12 17 22 7 12 17 22 7 12 17 22
รอบ 2ทีเจเสื้อ 2เสื้อ 7เสื้อ 12เสื้อ 1เสื้อ 6เสื้อ 11เสื้อ 16เสื้อ 5เสื้อ 10เสื้อ 15เสื้อ 4ที 9เสื้อ 14เสื้อ 3เสื้อ 8เสื้อ 13
ฉัน5 9 14 20 5 9 14 20 5 9 14 20 5 9 14 20
รอบ 3ทีเจเสื้อ 6ที 9เสื้อ 12เสื้อ 15เสื้อ 2เสื้อ 5เสื้อ 8เสื้อ 11เสื้อ 14เสื้อ 1เสื้อ 4เสื้อ 7เสื้อ 10เสื้อ 13เสื้อ 16เสื้อ 3
ฉัน4 11 16 23 4 11 16 23 4 11 16 23 4 11 16 23
รอบที่ 4ทีเจเสื้อ 1เสื้อ 8เสื้อ 15เสื้อ 6เสื้อ 13เสื้อ 4เสื้อ 11เสื้อ 2ที 9เสื้อ 16เสื้อ 7เสื้อ 14เสื้อ 5เสื้อ 12เสื้อ 3เสื้อ 10
ฉัน6 10 15 21 6 10 15 21 6 10 15 21 6 10 15 21

หลังจากครบ 4 รอบ ค่าใหม่ (แก้ไข) สำหรับแต่ละตัวแปร เอบีซีดีเพิ่ม (⊞) ให้กับต้นฉบับ (ค่าของตัวแปรก่อนรอบที่ 1)

5. การจัดเรียงไบต์ใหม่ในตัวแปร ABCD- หลังจากประมวลผลบล็อคทั้งหมดของข้อความต้นฉบับแล้ว จะมีการดำเนินการสลับไบต์แบบย้อนกลับสำหรับแต่ละตัวแปร

ค้นหาการชนกัน

ในปี 2004 นักวิจัยชาวจีน Wang Xiaoyun, Feng Dengguo, Lai Xuejia และ Yu Hongbo ประกาศว่าพวกเขาได้ค้นพบช่องโหว่ในอัลกอริทึมที่อนุญาตให้ IBM p690) ค้นหาการชนกัน

10.3. การใช้การเข้ารหัสเพื่อรับภาพแฮช

ในการสร้างอิมเมจแฮชที่ป้องกันการชนกัน สามารถใช้โหมดพิเศษที่มีให้ในบล็อกไซเฟอร์ (เช่น การต่อบล็อกไซเฟอร์ y) ไว้ได้ หรือในฟังก์ชันแฮชนั้นเอง สามารถใช้โหมดการเข้ารหัสบล็อกโหมดใดโหมดหนึ่งเป็นส่วนประกอบได้ ( ตัวอย่างเช่นแฮชของส่วนประกอบ -ฟังก์ชันตาม GOST 34.11-94 1 เป็นโหมดของการแทนที่อัลกอริธึมการแปลงการเข้ารหัสลับอย่างง่าย ๆ ตาม 2)

ขอให้เราระลึกว่าในกรณีที่ค่าฟังก์ชันแฮชไม่ได้ขึ้นอยู่กับต้นแบบเท่านั้น แต่ยังขึ้นอยู่กับคีย์ส่วนตัวด้วย ภาพแฮชจะเรียกว่า Message Authentication Code (MAC), Data Authentication Code (DAC) หรือ การแทรกเลียนแบบ.

ตัวอย่างเช่น เราจะให้โหมด (การผูกมัดบล็อกการเข้ารหัส)

มะเดื่อ 10.4. โครงร่างของอัลกอริทึม DES ในโหมดการผูกมัดบล็อกการเข้ารหัส

บล็อกที่เข้ารหัสล่าสุด ซีเอ็นและมีภาพแฮชของข้อความ T = (T 1, T 2, …, T n).

1 GOST 34.11-94 “เทคโนโลยีสารสนเทศ การปกป้องข้อมูลการเข้ารหัส ฟังก์ชั่นแฮช”

2 GOST 28147-89 “ระบบประมวลผลข้อมูล การป้องกันการเข้ารหัส อัลกอริธึมการแปลงการเข้ารหัส”

คำถามทดสอบตัวเอง

1. กำหนดแนวคิด: "", "", ""

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

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

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

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

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

ฟังก์ชันแฮช

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

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

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


14.1. หากคีย์มากกว่า s และน้อยกว่า t สามารถปรับขนาดได้โดยการลบ s และหารด้วย t-s นำคีย์เหล่านั้นมาอยู่ในช่วงค่าระหว่าง 0 ถึง 1 จากนั้นคูณด้วย M เพื่อให้ได้ที่อยู่ในตาราง .

ข้าว. 14.1.

หากคีย์เป็นจำนวนเต็ม w-bit คีย์เหล่านั้นสามารถแปลงเป็นทศนิยมและหารด้วย 2 w เพื่อสร้างทศนิยมในช่วงระหว่าง 0 ถึง 1 จากนั้นคูณด้วย M เช่นเดียวกับในย่อหน้าก่อนหน้า หากการดำเนินการจุดลอยตัวใช้เวลานานและตัวเลขไม่มากพอที่จะทำให้เกิดโอเวอร์โฟลว์ สามารถรับผลลัพธ์เดียวกันได้โดยใช้เลขคณิตจำนวนเต็ม: คูณคีย์ด้วย M จากนั้นให้เลื่อนบิตไปทางขวาเพื่อหารด้วย 2 w (หรือหาก การคูณจะส่งผลให้เกิดการล้น ทำกะแล้วคูณ) วิธีการดังกล่าวไม่มีประโยชน์สำหรับการแฮช เว้นแต่ว่าคีย์จะมีการกระจายเท่าๆ กันตลอดช่วง เนื่องจากค่าแฮชจะถูกกำหนดโดยตัวเลขนำหน้าของคีย์เท่านั้น

วิธีที่ง่ายกว่าและมีประสิทธิภาพมากกว่าสำหรับจำนวนเต็ม w-bit อาจเป็นหนึ่งในวิธีการแปลงค่าที่ใช้บ่อยที่สุด โดยเลือกจำนวนเฉพาะเป็นขนาด M ของตาราง และคำนวณส่วนที่เหลือเมื่อหาร k ด้วย M กล่าวคือ h(k) = k mod M สำหรับคีย์จำนวนเต็มใดๆ k ฟังก์ชันนี้เรียกว่าฟังก์ชันแฮชแบบโมดูลาร์ คำนวณได้ง่ายมาก (k % M ใน C++) และมีประสิทธิภาพในการบรรลุการกระจายค่าคีย์ที่สม่ำเสมอระหว่างค่าที่น้อยกว่า M ตัวอย่างเล็ก ๆ แสดงในรูปที่ 1


14.2.

ข้าว. 14.2.

คอลัมน์สามคอลัมน์ทางด้านขวาแสดงผลลัพธ์ของการแฮชคีย์ 16 บิตที่แสดงทางด้านซ้ายโดยใช้ฟังก์ชันต่อไปนี้:

โวลต์% 97 (ซ้าย)

v% 100 (กลาง) และ

(int) (a * v) % 100 (ขวา)

โดยที่ a = .618033 ขนาดตารางสำหรับฟังก์ชันเหล่านี้คือ 97, 100 และ 100 ตามลำดับ ค่าปรากฏแบบสุ่ม (เนื่องจากคีย์เป็นแบบสุ่ม) ฟังก์ชันที่สอง (v % 100) ใช้เพียงตัวเลขสองหลักทางขวาสุดของคีย์เท่านั้น ดังนั้นจึงอาจแสดงประสิทธิภาพที่ไม่ดีสำหรับคีย์ที่ไม่ใช่แบบสุ่ม

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

เหตุผลหลักในการเลือกตารางแฮชจำนวนเฉพาะขนาด M สำหรับการแฮชแบบโมดูลาร์แสดงไว้ในรูปที่ 1

14.3. ในตัวอย่างข้อมูลอักขระ 7 บิตนี้ คีย์จะถือเป็นตัวเลขฐาน 128 - หนึ่งหลักสำหรับแต่ละอักขระในคีย์ ปัจจุบันคำนี้ตรงกับหมายเลข 1816567 ซึ่งสามารถเขียนเป็นก็ได้


เพราะในโค้ด ASCII อักขระ n, o และ w ตรงกับตัวเลข 1568 = 110, 1578 = 111 และ 1678 = 119 การเลือกขนาดตาราง M = 64 สำหรับประเภทคีย์นี้เป็นเรื่องที่โชคร้ายเนื่องจากการบวกทวีคูณของ 64 (หรือ 128) เข้ากับ x จะไม่เปลี่ยนค่าของ x mod 64 - สำหรับคีย์ใด ๆ ค่าแฮชคือค่าของตัวเลข 6 หลักสุดท้าย ของคีย์นั้น แน่นอนว่าฟังก์ชันแฮชที่ดีจะต้องคำนึงถึงบิตทั้งหมดของคีย์ด้วย โดยเฉพาะคีย์อักขระ สถานการณ์ที่คล้ายกันอาจเกิดขึ้นเมื่อ M มีตัวประกอบที่เป็นกำลัง 2 วิธีที่ง่ายที่สุดในการหลีกเลี่ยงคือการเลือกจำนวนเฉพาะสำหรับ M

ข้าว. 14.3.

การแฮชแบบโมดูลาร์นั้นใช้งานง่ายมาก ยกเว้นว่าขนาดตารางต้องเป็นจำนวนเฉพาะ สำหรับบางแอปพลิเคชัน คุณสามารถพึงพอใจกับจำนวนเฉพาะที่ทราบจำนวนน้อยได้ หรือคุณสามารถค้นหารายการจำนวนเฉพาะที่ทราบเพื่อหาจำนวนที่ใกล้เคียงกับขนาดตารางที่ต้องการได้ ตัวอย่างเช่น จำนวนที่เท่ากับ 2 t - 1 จะเป็นจำนวนเฉพาะเมื่อ เสื้อ = 2, 3, 5, 7, 13, 17, 19 และ 31(และไม่มีค่าอื่นของ t< 31 ): это известные простые числа Мерсенна. Чтобы динамически распределить таблицу нужного размера, нужно вычислить простое число, близкое к этому значению. Такое вычисление нетривиально (хотя для этого и существует остроумный алгоритм, который будет рассмотрен в части 5), поэтому на практике обычно используют таблицу заранее вычисленных значений (см. рис. 14.4). Использование модульного хеширования - не единственная причина, по которой размер таблицы стоит сделать простым числом; еще одна причина рассматривается в разделе 14.4.


ข้าว. 14.4.

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

อีกทางเลือกหนึ่งสำหรับการจัดการคีย์จำนวนเต็มคือการรวมวิธีการคูณและโมดูลาร์เข้าด้วยกัน: คุณคูณคีย์ด้วยค่าคงที่ระหว่าง 0 ถึง 1 จากนั้นหารโมดูโล M หรืออีกนัยหนึ่ง คุณต้องใช้ฟังก์ชัน มีความสัมพันธ์ระหว่างค่าของ , M และเลขฐานประสิทธิผลของคีย์ที่อาจนำไปสู่พฤติกรรมที่ผิดปกติในทางทฤษฎี แต่ถ้าใช้ค่า a โดยพลการก็ไม่น่าจะมีปัญหาใด ๆ เกิดขึ้นในแอปพลิเคชันจริง บ่อยครั้งจะเลือกค่า φ = 0.618033... (อัตราส่วนทองคำ) เป็น a

มีการสำรวจรูปแบบอื่นๆ มากมายในธีมนี้ โดยเฉพาะฟังก์ชันแฮช ซึ่งสามารถนำไปใช้ได้โดยใช้คำสั่งเครื่องที่มีประสิทธิภาพ เช่น การจัดสรรกะและมาสก์ (ดูส่วนข้อมูลอ้างอิง)

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

ในโค้ด ASCII 7 บิต คำนี้สอดคล้องกับตัวเลข 84 บิต \begin(align*) 97 \cdot 128^(11) &+ 118 \cdot 128^(10) + 101 \cdot 128^(9) + 114 \ cdot 128^(8) + 121 \cdot 128^(7)\\ &+ 108 \cdot 128^(6) + 111 \cdot 128^(5) + 110 \cdot 128^(4) + 103 \ cdot 128 ^(3)\\ &+ 107 \cdot 128^(2) + 101 \cdot 128^(1) + 121 \cdot 128^(0), \end(align*),

ซึ่งใหญ่เกินกว่าจะรองรับฟังก์ชันเลขคณิตปกติในคอมพิวเตอร์ส่วนใหญ่ และบ่อยครั้งที่จำเป็นต้องประมวลผลคีย์ที่นานกว่ามาก

ในการคำนวณฟังก์ชันแฮชแบบโมดูลาร์สำหรับคีย์แบบยาว ฟังก์ชันเหล่านี้จะถูกแปลงทีละส่วน คุณสามารถใช้ประโยชน์จากคุณสมบัติทางคณิตศาสตร์ของฟังก์ชันโมดูลัสและใช้อัลกอริทึมของฮอร์เนอร์ได้ (ดูหัวข้อ 4.9 "ประเภทข้อมูลนามธรรม") วิธีการนี้อิงจากวิธีอื่นในการเขียนตัวเลขที่สอดคล้องกับคีย์ สำหรับตัวอย่างที่อยู่ระหว่างการพิจารณา เราเขียนนิพจน์ต่อไปนี้: \begin(align*) ((((((((97 \cdot 128^(11) &+ 118) \cdot 128^(10) + 101) \ cdot 128^( 9) + 114) \cdot 128^(8) + 121) \cdot 128^(7)\\ &+ 108) \cdot 128^(6) + 111) \cdot 128^(5) + 110) \cdot 128^(4) + 103) \cdot 128^(3)\\ &+ 107) \cdot 128^(2) + 101) \cdot 128^(1) + 121. \end(align* )

นั่นคือเลขทศนิยมที่สอดคล้องกับการเข้ารหัสอักขระของสตริงสามารถคำนวณได้โดยการสแกนจากซ้ายไปขวา คูณค่าสะสมด้วย 128 แล้วเพิ่มค่าการเข้ารหัสของอักขระถัดไป ในกรณีของสตริงที่ยาว วิธีการคำนวณนี้จะทำให้ได้ตัวเลขที่มากกว่าจำนวนที่สามารถแสดงในคอมพิวเตอร์ได้ในที่สุด อย่างไรก็ตาม ไม่จำเป็นต้องใช้ตัวเลขนี้ เนื่องจากต้องใช้เพียงเศษที่เหลือจากการหารด้วย M เท่านั้น ผลลัพธ์สามารถได้รับโดยไม่ต้องเก็บมูลค่าสะสมจำนวนมากด้วยซ้ำ เนื่องจาก ณ จุดใด ๆ ในการคำนวณ เราสามารถละทิ้งตัวคูณของ M ได้ - แต่ละครั้งที่เราทำการคูณและบวก เราเพียงแต่เก็บเศษที่เหลือของการหารโมดูโล M เท่านั้น ผลลัพธ์จะเหมือนกับว่าเรามีโอกาสคำนวณ ตัวเลขยาวแล้วจึงหาร (ดูแบบฝึกหัด 14.10) การสังเกตนี้นำไปสู่วิธีทางคณิตศาสตร์ที่ตรงไปตรงมาสำหรับการคำนวณฟังก์ชันแฮชแบบโมดูลาร์สำหรับสตริงยาว - ดูโปรแกรม 14.1 โปรแกรมนี้ใช้เคล็ดลับสุดท้าย: แทนที่จะใช้ฐาน 128 จะใช้จำนวนเฉพาะ 127 สาเหตุของการเปลี่ยนแปลงนี้จะกล่าวถึงในย่อหน้าถัดไป

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

โปรแกรม 14.1. ฟังก์ชันแฮชสำหรับคีย์สตริง

M = 96 และ a = 128 (บนสุด)

M = 97 และ a = 128 (กึ่งกลาง) และ

M=96 และ a=127 (ล่าง)

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

โปรแกรม 14.1 แสดงวิธีหนึ่งที่จะทำสิ่งนี้: การใช้ไพรม์ฐานแทนกำลัง 2 และจำนวนเต็มที่สอดคล้องกับการแสดง ASCII ของสตริง ในรูป 14.5 รูปที่.

ตามทฤษฎีแล้ว ฟังก์ชันแฮชสากลในอุดมคติคือฟังก์ชันที่ความน่าจะเป็นของการชนกันระหว่างคีย์ 2 ตัวในตารางขนาด M คือ 1/M พอดี สามารถพิสูจน์ได้ว่าการใช้ลำดับของค่าที่แตกต่างกันแบบสุ่มเป็นค่าสัมประสิทธิ์ a ในโปรแกรม 14.1 แทนที่จะเป็นค่าคงที่คงที่ จะแปลงการแฮชแบบโมดูลาร์เป็นฟังก์ชันแฮชสากล อย่างไรก็ตาม ค่าใช้จ่ายในการสร้างตัวเลขสุ่มใหม่สำหรับอักขระแต่ละตัวในคีย์มักจะไม่สามารถยอมรับได้ ในทางปฏิบัติ การประนีประนอมที่แสดงในโปรแกรม 14.1 สามารถทำได้โดยการไม่จัดเก็บอาร์เรย์ของตัวเลขสุ่มที่แตกต่างกันสำหรับอักขระคีย์แต่ละตัว แต่โดยการเปลี่ยนแปลงค่าสัมประสิทธิ์โดยการสร้างลำดับสุ่มหลอกแบบง่าย

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

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

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

เช็คซัม

ไม่ซับซ้อน รวดเร็วและง่ายดายอย่างยิ่งในอัลกอริธึมฮาร์ดแวร์ที่ใช้เพื่อป้องกันการบิดเบือนโดยไม่ได้ตั้งใจ รวมถึงข้อผิดพลาดของฮาร์ดแวร์

ความเร็วในการคำนวณเร็วกว่าฟังก์ชันแฮชการเข้ารหัสหลายสิบเท่าและง่ายกว่ามากในการใช้งานฮาร์ดแวร์

ราคาสำหรับความเร็วสูงดังกล่าวคือการขาดความเข้มแข็งในการเข้ารหัสซึ่งเป็นโอกาสที่ง่ายในการปรับข้อความให้เป็นจำนวนที่ทราบล่วงหน้า นอกจากนี้ เช็คซัม (โดยทั่วไป: 32 บิต) มักจะมีความกว้างต่ำกว่าแฮชการเข้ารหัส (โดยทั่วไป: 128, 160 และ 256 บิต) ซึ่งหมายความว่าอาจเกิดการชนกันโดยไม่ได้ตั้งใจได้

กรณีที่ง่ายที่สุดของอัลกอริธึมดังกล่าวคือการแบ่งข้อความออกเป็นคำขนาด 32 หรือ 16 บิตแล้วรวมเข้าด้วยกัน ซึ่งใช้ใน TCP/IP เป็นต้น

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

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

ในบรรดาฟังก์ชันแฮชที่มีอยู่จำนวนมาก เป็นเรื่องปกติที่จะแยกแยะฟังก์ชันแฮชที่แข็งแกร่งในการเข้ารหัสที่ใช้ในการเข้ารหัส ฟังก์ชันแฮชที่เข้ารหัสต้องมีก่อนอื่น ทนต่อการชนกันสองประเภท:

การใช้การแฮช

ฟังก์ชันแฮชยังใช้ในโครงสร้างข้อมูลบางอย่าง เช่น ตารางแฮชและต้นไม้คาร์ทีเซียน ข้อกำหนดสำหรับฟังก์ชันแฮชในกรณีนี้แตกต่างออกไป:

  • การผสมข้อมูลที่ดี
  • อัลกอริธึมการคำนวณที่รวดเร็ว

การกระทบยอดข้อมูล

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

กำลังตรวจสอบข้อผิดพลาด

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

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

การตรวจสอบรหัสผ่าน

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

ตัวอย่างในกรณีนี้คือ GNU/Linux และ Microsoft Windows XP พวกเขาเก็บเฉพาะค่าแฮชของข้อความรหัสผ่านจากบัญชีผู้ใช้เท่านั้น

เร่งความเร็วในการดึงข้อมูล

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

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

รายการอัลกอริธึม

  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512)
  • RIPEMD-160
  • RIPEMD-320
  • สเนฟรู
  • เสือ(วังวน
  • การตรวจสอบอินเทอร์เน็ต IP (RFC 1071)

ลิงค์

มูลนิธิวิกิมีเดีย

2010.

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

    ดูว่า "รหัสแฮช" ในพจนานุกรมอื่น ๆ คืออะไร:คำศัพท์ที่เป็นทางการ

    - ผลลัพธ์ของการรวมเลขคณิตกับไบต์ทั้งหมดของโค้ดโปรแกรมหรือชุดข้อมูล ผลลัพธ์ของอัลกอริธึมการแฮชมีเพียงบางไบต์เท่านั้น และอัลกอริธึมได้รับการออกแบบในลักษณะที่การแก้ไขโค้ดโปรแกรมหรือข้อมูลด้วย... ...รหัสตรวจสอบข้อความโดยใช้ฟังก์ชันแฮช - (ITU T N.235.3, ITU T N.235.1)

    หัวข้อ: โทรคมนาคม แนวคิดพื้นฐาน EN รหัสตรวจสอบข้อความที่แฮชแล้ว HMAC...

    คู่มือนักแปลด้านเทคนิค

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

    บทความนี้เกี่ยวกับรหัส สำหรับวิธีการระดมความคิด โปรดดูการ์ด CRC การตรวจสอบความซ้ำซ้อนแบบวน (CRC) เป็นอัลกอริทึมสำหรับการคำนวณผลรวมตรวจสอบที่ออกแบบมาเพื่อตรวจสอบความสมบูรณ์ของ... ... Wikipedia

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

    MI 2891-2004: คำแนะนำ จีซอย. ข้อกำหนดทั่วไปสำหรับซอฟต์แวร์เครื่องมือวัด- คำศัพท์เฉพาะทาง MI 2891 2004: คำแนะนำ จีซอย. ข้อกำหนดทั่วไปสำหรับซอฟต์แวร์ของเครื่องมือวัด: ข้อมูลการวัดข้อมูลนำเสนอในรูปแบบที่เหมาะสมสำหรับการส่งผ่าน การตีความ หรือการประมวลผล คำจำกัดความของคำจาก... ... หนังสืออ้างอิงพจนานุกรมเกี่ยวกับเอกสารเชิงบรรทัดฐานและทางเทคนิค

บ่อยครั้งเมื่อดาวน์โหลดทอร์เรนต์หรือตัวไฟล์เอง คำอธิบายจะเขียนประมาณว่า “ad33e486d0578a892b8vbd8b19e28754” (เช่น ใน ex.ua) โดยมักจะมีคำนำหน้าว่า “md5” นี่คือรหัสแฮช - ผลลัพธ์ที่ฟังก์ชันแฮชสร้างขึ้นหลังจากประมวลผลข้อมูลขาเข้า แปลจากภาษาอังกฤษ แฮช หมายถึงความสับสน กัญชา วัชพืช หรือจานเนื้อและผักสับละเอียด ยากมาก ยากมาก ใครๆ ก็บอกว่าแทบเป็นไปไม่ได้ จากนั้นคำถามก็เกิดขึ้น:“ เหตุใดจึงจำเป็นทั้งหมดนี้? พวกเขาแจก gobbledygook ที่เข้าใจยากซึ่งก็ถอดรหัสไม่ได้เช่นกัน” สิ่งนี้จะกล่าวถึงในบทความนี้

ฟังก์ชันแฮชคืออะไรและทำงานอย่างไร

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

เหตุใดจึงจำเป็นต้องมีฟังก์ชันแฮช

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

ฟังก์ชั่นแฮช: มันคืออะไร?

ฟังก์ชันแฮชสามารถมีได้หนึ่งในสามประเภท ขึ้นอยู่กับวัตถุประสงค์:

1. ฟังก์ชั่นตรวจสอบความสมบูรณ์ของข้อมูล

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

2. ฟังก์ชั่นการเข้ารหัส

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

3. ฟังก์ชั่นที่ออกแบบมาเพื่อสร้างโครงสร้างข้อมูลที่มีประสิทธิภาพ

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