แฮชในการเข้ารหัส

คุณต้องการเรียนรู้เกี่ยวกับการแฮชในการเข้ารหัสหรือไม่? ถ้าคุณทำแสดงว่าคุณมาถูกที่แล้ว.

ในบทความนี้เราจะสำรวจเพิ่มเติมเกี่ยวกับการแฮช.

การแฮชเป็นเทคนิคทางวิทยาศาสตร์คอมพิวเตอร์ในการระบุวัตถุหรือค่าจากกลุ่มของวัตถุหรือค่า.

ฟังดูสับสน?

ลองทำความเข้าใจตามตัวอย่าง.

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

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

ตัวอย่างที่ทันสมัยของการแฮชคือผู้เล่นเกมที่ลงทะเบียนเกม Valorant เป็นเกมเล่นฟรีที่เปิดตัวโดย Riot การเล่นฟรีหมายความว่าผู้คนนับล้านจะเล่นเกมนี้.

ผู้เล่นแต่ละคนจะถูกระบุโดยใช้ค่าประจำตัวที่สร้างขึ้นโดยใช้อัลกอริทึมการแฮช.

ลองทำความเข้าใจในรายละเอียดเพิ่มเติมด้านล่าง.

 

Hashing คืออะไร?

ตามที่ระบุไว้ข้างต้นการแฮชเป็นวิธีการระบุวัตถุจากกลุ่ม.


แต่ละออบเจ็กต์จะได้รับหมายเลขประจำตัวที่ไม่ซ้ำกันเมื่อแฮช.

แต่นั่นหมายความว่าอย่างไรในทางเทคนิค?

ในทางเทคนิคฟังก์ชันทางคณิตศาสตร์จะสร้างเอาต์พุตที่มีความยาวคงที่จากสตริงอินพุตที่มีความยาวเท่าใดก็ได้.

มีการแฮชธุรกรรม Bitcoin ซึ่งธุรกรรมจะได้รับรหัสที่ไม่ซ้ำกัน.

หากคุณใส่คำว่า“ Hello, World!” ใน อัลกอริทึมการแฮช SHA-256, คุณจะได้รับผลลัพธ์ต่อไปนี้:

อินพุต: สวัสดีชาวโลก!

เอาท์พุต: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f

ที่นี่ SHA256 สร้างเอาต์พุตจากอินพุตที่กำหนด อย่างที่คุณเห็นเราใช้อัลกอริทึมการแฮชฟังก์ชัน Secure Hash (SHA-256) เป็นหนึ่งในวิธีการแฮชที่ได้รับความนิยมเช่น Message Direct (MD5) และ Secure Hash Function (SHA1).

คุณสมบัติที่สำคัญของฟังก์ชันแฮชทำให้เชื่อถือได้ มาดูรายการด้านล่างกัน.

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

เราได้กล่าวถึง Cryptographic Hashing สำหรับผู้เริ่มต้นที่นี่แล้ว ลองดูที่นั่น: การแฮชด้วยการเข้ารหัส: คู่มือสำหรับผู้เริ่มต้น. 

แต่ถ้าคุณมาที่นี่เพื่อความก้าวหน้าคุณจะไม่ผิดหวัง.

 

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

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

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

ในการใช้ฟังก์ชันแฮชคุณสามารถถอดสองแนวทางที่ต้องการออกได้.

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

ในวิธีที่ 2 ฟังก์ชั่นจะเป็นดังนี้:

hash = hash_function (คีย์) ดัชนี = แฮช% array_size

ที่นี่ขนาดแฮชและอาร์เรย์เป็นอิสระจากกัน ค่าดัชนีคำนวณตามขนาดอาร์เรย์ ตัวดำเนินการ Modulo (%) ช่วยให้เราสามารถคำนวณค่าได้.

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

 

การเขียนฟังก์ชันแฮชที่ดี

หากคุณต้องการสร้างฟังก์ชันหรือกลไกแฮชที่ดีคุณต้องเข้าใจข้อกำหนดพื้นฐานของการสร้าง เรามาดูรายการด้านล่าง:

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

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

 

ทำไมเราต้องมีฟังก์ชันแฮชที่ดี?

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

สมมติว่าเราต้องการสร้างตารางแฮชโดยใช้เทคนิคการแฮชโดยสตริงอินพุตจะเป็นดังนี้ {“ agk”,“ kag”,“ gak”,“ akg”,“ kga”,“ gka”}

ตอนนี้เราสร้างฟังก์ชันแฮชที่เพิ่มค่า ASCII ของ a (97), g (103) และ k (107) จากนั้นสร้างโมดูโลของผลรวมด้วย 307.

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

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

 

การเรียนรู้เกี่ยวกับตารางแฮช

ตารางแฮชมีประโยชน์มากในการจัดเก็บผลลัพธ์ของฟังก์ชันแฮชซึ่งคำนวณดัชนีแล้วเก็บค่าไว้กับมัน ผลลัพธ์ที่ได้คือกระบวนการคำนวณที่เร็วขึ้นโดยมีความซับซ้อน O (1).

ตารางแฮชเป็นทางเลือกที่ดีในการแก้ปัญหาที่ต้องใช้เวลา O (n).

ดังนั้นหากคุณเลือกสตริงที่มีความยาวคงที่แล้วลองเรียนรู้ความถี่อักขระของสตริง.

ดังนั้นถ้า string =“ aacddce” วิธีการทั่วไปคือการส่งผ่านสตริงหลาย ๆ ครั้งและเก็บแต่ละความถี่.

# ระบุสตริงอินพุตและนับความถี่ของอักขระในสตริงนั้น

# อัลกอริทึมคือ 0 (n) เวลาที่ซับซ้อน

temp_list = [] start = "ก" str = "ababcddefff" def alpha_zeta (): alpha = ‘a’ สำหรับ i ในช่วง (0,26): temp_list.append (alpha) alpha = chr (ord (alpha) + 1) ส่งคืน temp_list temp_list = alpha_zeta () #print (temp_list) def character_frequency (str, temp_list): สำหรับแต่ละรายการใน temp_list: freq = 0 สำหรับ i ใน str: if (i == each): freq = freq + 1 print (each, freq) character_frequency (str, temp_list)

ผลลัพธ์ของโปรแกรมข้างต้นจะเป็นดังนี้:

a 2 b 2 c 1 d 2 e 1 f 3 g 0 h 0 i 0 .. ..

ตอนนี้เรามาใช้ตารางแฮชใน C ++ และนับความถี่ของอักขระ.

# รวมการใช้เนมสเปซ std; int ความถี่ [26]; int hashFunc (ถ่าน c) {return (c – ‘a’); } โมฆะ countFre (สตริง S) {สำหรับ (int i = 0; i< ส. ความยาว (); ++ i) {ดัชนี int = hashFunc (S [i]); ความถี่ [ดัชนี] ++; } สำหรับ (int i = 0; i<26; ++ i) {cout << (ถ่าน) (i + ‘a’) << ” << ความถี่ [i]<< เอนด์; }} int main () {cout<<"สวัสดีชาวโลก"; countFre ("abbaccbdd"); }

ผลลัพธ์ของโปรแกรมจะเป็นดังนี้:

ก 2 ข 3 ค 2 ง 2

ความซับซ้อน O (N) ของอัลกอริทึมทำให้เร็วขึ้นเมื่อเทียบกับวิธีเชิงเส้นอื่น ๆ.

วิธีแก้ปัญหาการชน

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

 

สำรวจ Hash ใน Python

ในส่วนนี้เราจะดูแฮชใน Python อย่างรวดเร็ว เหตุผลที่เราเลือก Python ก็คือมันอ่านง่ายและทุกคนสามารถใช้ได้โดยไม่มีปัญหามากนัก.

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

ไวยากรณ์ของวิธีแฮชคือ:

แฮช (วัตถุ)

อย่างที่คุณเห็นมันใช้พารามิเตอร์เดียวซึ่งก็คือออบเจ็กต์ วัตถุสามารถเป็นจำนวนเต็มลอยหรือสตริง.

ค่าที่ส่งคืนของเมธอด hash () ขึ้นอยู่กับอินพุต สำหรับจำนวนเต็มอาจส่งคืนตัวเลขเดียวกันในขณะที่ทศนิยมและสตริงจะแตกต่างกัน.

ลองดูตัวอย่างด้านล่าง.

num = 10 เดซิ = 1.23556 str1 = "Nitish" พิมพ์ (แฮช (num)) พิมพ์ (แฮช (เดซิ)) พิมพ์ (แฮช (str1))

ผลลัพธ์ของโค้ดด้านบนมีดังต่อไปนี้:

อย่างไรก็ตามไม่สามารถใช้การแฮชกับอ็อบเจ็กต์ทุกประเภท ตัวอย่างเช่นหากคุณจำได้ว่าเราสร้างรายการ a ถึง z ในโปรแกรมแรกของเรา หากเราพยายามแฮชหน้าต่างผลลัพธ์จะผ่าน TypeError: unhashable type: ‘list’

ในการใช้การแฮชกับรายการวัตถุคุณต้องใช้ทูเพิล.

สระ = (‘a’, ‘e’, ​​’i’, ‘o’, ‘u’) พิมพ์ (แฮช (สระ)) เอาต์พุต Output -5678652950122127926

การแฮชในการเข้ารหัส

การแฮชมีประโยชน์ต่อการเข้ารหัส Bitcoin ใช้การแฮชเพื่อสร้างและจัดการต้นไม้ Merkle

นอกจากนี้การแฮชยังเป็นส่วนหนึ่งของการเข้ารหัสมาเป็นเวลานานแล้ว อย่างไรก็ตามกรณีการใช้งานที่ดีที่สุดของการแฮชคือการแฮชรหัสผ่านและจัดเก็บไว้. 

ต้นไม้ Merkle

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

เครือข่ายส่วนกลางใด ๆ ไม่ต้องกังวลเกี่ยวกับการจัดเก็บและการเข้าถึงข้อมูลเนื่องจากมีเพียงแหล่งเดียวสำหรับการเข้าถึงและจัดเก็บข้อมูล อย่างไรก็ตามสมการจะเปลี่ยนไปเมื่อมีเครือข่ายแบบกระจายอำนาจเนื่องจากตอนนี้ต้องคัดลอกข้อมูลท่ามกลางเพื่อนร่วมงานหลายร้อยคนที่เข้าร่วม.

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

ตัวอย่าง Merkle Tree

แต่ทำไมเราถึงพูดถึงต้นไม้ Merkle ที่นี่? ต้นไม้ Merkle ใช้แฮชเป็นฟังก์ชันหลักในการเชื่อมต่อโหนดและบล็อกข้อมูลต่างๆ.

Merkle Trees เป็นต้นไม้กลับหัวที่สามารถสรุปชุดธุรกรรมทั้งหมดได้.

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

คำแนะนำเกี่ยวกับต้นไม้ Merkle ที่นั่นเราได้พูดคุยกันว่าต้นไม้ Merkle ดำเนินการอย่างไรใน bitcoin และกรณีการใช้งานอื่น ๆ.

กระบวนการขุด

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

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

เมื่อทำเสร็จแล้วเพื่อนร่วมงานทั้งหมดในเครือข่ายจะรับทราบการเพิ่มบล็อกใหม่.

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

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

สรุปกระบวนการได้ตามขั้นตอนต่อไปนี้:

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

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

 

สรุป

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

คุณคิดอย่างไรเกี่ยวกับเรื่องนี้? แสดงความคิดเห็นด้านล่างและแจ้งให้เราทราบ.

 

#FAQ

การแฮชในการเข้ารหัสคืออะไร?

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

วิธีการแฮชใช้ในการเข้ารหัส?

การเข้ารหัสใช้การแฮชเพื่อแฮชรหัสผ่านหรือสร้างหมายเลขประจำตัวที่ไม่ซ้ำกัน.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
Adblock
detector
map