Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การเข้ารหัส MD5 ด้วย Python

ความกังวลหลักของบริษัท IT ทุกแห่งคือความปลอดภัยของข้อมูลของพวกเขา มีเทคนิคการแฮชหลายอย่างเพื่อปกป้องและตรวจสอบข้อมูลของเรา

Hash คืออะไร

Hash เป็นฟังก์ชันที่รับลำดับไบต์ความยาวตัวแปรเป็นอินพุตและแปลงเป็นลำดับความยาวคงที่ อย่างไรก็ตาม การรับข้อมูลต้นฉบับ (input bytes) กลับมาไม่ใช่ง่าย ตัวอย่าง x คืออินพุตของคุณ และ f คือ f คือฟังก์ชันแฮช แล้วการคำนวณ f(x) รวดเร็วและง่าย แต่พยายามรับ x อีกครั้งเป็นงานที่ใช้เวลานานมาก

ค่าที่คืนจากฟังก์ชันแฮช เรียกว่า hash, checksum, hash value หรือ message digest

เราสามารถสรุปข้างต้นได้ดังนี้:

การเข้ารหัส MD5 ด้วย Python

สมมติคุณต้องการแปลงข้อความ "Hello World" เป็นฟังก์ชันแฮช md5 ผลลัพธ์คือ a:

การเข้ารหัส MD5 ด้วย Python

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

ฟังก์ชันแฮชหรืออัลกอริทึมที่ใช้บ่อยที่สุดสองตัวคือ:

  • MD5 - MD5 หรือ message digest algorithm จะสร้างค่าแฮช 128-bit มีปัญหาความปลอดภัยบางประการกับอัลกอริทึม md5 นั่นคือเหตุผลที่เราใช้หลักเพื่อตรวจสอบความสมบูรณ์ของข้อมูล
  • SHA - มีอัลกอริทึมหลายตัวภายใต้กลุ่ม SHA ซึ่งพัฒนาโดย U.S Federal Information processing standard อัลกอริทึมเหล่านี้ปลอดภัยกว่า md5 มาก และใช้กันอย่างกว้างขวางในหลายพื้นที่ รวมถึงแอปพลิเคชันเข้ารหัส ข้อความที่สร้างโดยอัลกอริทึมเหล่านี้มีขนาด 160 ถึง 512 บิต

MD5

ไลบรารีมาตรฐานของ Python รวมโมดูลที่ชื่อ hashlib ซึ่งมีอัลกอริทึมแฮชยอดนิยมส่วนใหญ่ ส่วนใหญ่ของอัลกอริทึมถูกนำไปปฏิบัติภายในโมดูล hashlib อย่างไรก็ตาม หากคุณติดตั้ง OpenSSL hashlib สามารถใช้ทำงานกับอัลกอริทึมเหล่านั้นได้เช่นกัน

ก่อนอื่น หากคุณต้องการใช้อัลกอริทึมแฮชใดๆ ให้นำเข้าโมดูล hashlib:

import hashlib

ตอนนี้ตรวจสอบว่าอัลกอริทึมที่ต้องการหรืออัลกอริทึมไหนบ้างที่มีอยู่ในโมดูล hashlib:

>> print(hashlib.algorithms_available)
{'sha3_256', 'sha3_224', 'sha1', 'blake2b', 'sha512', 'dsaEncryption', 'dsaWithSHA', 'DSA', 'md5', 'sha384', 'sha224', 'sha3_384', 'ecdsa-with-SHA1', 'DSA-SHA', 'SHA1', 'md4', 'SHA256', 'MD4', 'sha3_512', 'whirlpool', 'sha256', 'shake_256', 'SHA', 'RIPEMD160', 'shake_128', 'SHA512', 'ripemd160', 'SHA224', 'sha', 'blake2s', 'SHA384', 'MD5'}

รายการอัลกอริทึมที่พร้อมใช้งานผ่าน hashlib module รวมถึงอัลกอริทึมผ่าน OpenSSL

อย่างไรก็ตาม เพื่อตรวจสอบรายการอัลกอริทึมที่พร้อมใช้งานเสมอ เราสามารถตรวจสอบผ่าน algorithms_guaranteed:

>> print(hashlib.algorithms_guaranteed)
{'sha3_512', 'sha256', 'sha3_256', 'shake_256', 'sha3_224', 'sha1', 'blake2b', 'sha512', 'md5', 'shake_128', 'sha384', 'sha224', 'sha3_384', 'blake2s'}

ลองสร้างโปรแกรมง่ายๆ ผ่านอัลกอริทึม md5:

โค้ด

import hashlib
hash_obj = hashlib.md5(b'Hello, Python!')
print(hash_obj.hexdigest())

ผลลัพธ์

a0af7810eb5fcb84c730f851361de06a

โค้ดข้างต้นรับสตริง "Hello, Python!" เป็นอินพุตและพิมพ์ HEX digest ของสตริงนั้น Hexdigest คืนค่าสตริง HEX ที่แทนแฮช

อย่างไรก็ตาม หากคุณต้องการลำดับไบต์ที่คืนค่า คุณควรใช้ hash_obj.digest() เช่น:

import hashlib
hash_obj = hashlib.md5(b'Hello, Python!')
# To generate, sequence of bytes
print(hash_obj.digest())

ผลลัพธ์

b'\xa0\xafx\x10\xeb_\xcb\x84\xc70\xf8Q6\x1d\xe0j'

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

ในกรณีที่คุณต้องการส่งสตริงจากคอนโซล อย่าลืมเข้ารหัสสตริงเป็นลำดับไบต์:

import hashlib
mystring = input('Enter string to hash: ')
hash_obj = hashlib.md5(mystring.encode())
print(hash_obj.hexdigest())

ผลลัพธ์

Enter string to hash: Hello, TutorialsPoint
9a5d3fad65690dcf44adaec67226abe7