ความกังวลหลักของบริษัท IT ทุกแห่งคือความปลอดภัยของข้อมูลของพวกเขา มีเทคนิคการแฮชหลายอย่างเพื่อปกป้องและตรวจสอบข้อมูลของเรา
Hash คืออะไร
Hash เป็นฟังก์ชันที่รับลำดับไบต์ความยาวตัวแปรเป็นอินพุตและแปลงเป็นลำดับความยาวคงที่ อย่างไรก็ตาม การรับข้อมูลต้นฉบับ (input bytes) กลับมาไม่ใช่ง่าย ตัวอย่าง x คืออินพุตของคุณ และ f คือ f คือฟังก์ชันแฮช แล้วการคำนวณ f(x) รวดเร็วและง่าย แต่พยายามรับ x อีกครั้งเป็นงานที่ใช้เวลานานมาก
ค่าที่คืนจากฟังก์ชันแฮช เรียกว่า hash, checksum, hash value หรือ message digest
เราสามารถสรุปข้างต้นได้ดังนี้:

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

ในสถานการณ์จริง ฟังก์ชันแฮชถูกใช้อย่างหนักในอัลกอริทึมเข้ารหัส ลายเซ็นดิจิทัล นิ้วมือ จัดเก็บรหัสผ่าน และอีกหลายพื้นที่ ในฐานะโปรแกรมเมอร์ Python เราต้องการฟังก์ชันแฮชเพื่อตรวจสอบการซ้ำซ้อนของข้อมูลหรือไฟล์ ตรวจสอบความสมบูรณ์ของข้อมูลเมื่อส่งข้อมูลผ่านเครือข่ายสาธารณะ จัดเก็บรหัสผ่านในฐานข้อมูล ฯลฯ
ฟังก์ชันแฮชหรืออัลกอริทึมที่ใช้บ่อยที่สุดสองตัวคือ:
- MD5 - MD5 หรือ message digest algorithm จะสร้างค่าแฮش 128-bit มีปัญหาความปลอดภัยบางประการกับอัลกอริทึม md5 นั่นคือเหตุผลที่เราใช้หลักเพื่อตรวจสอบความสมบูรณ์ของข้อมูล
- SHA - มีอัลกอริทึมหลายตัวภายใต้กลุ่ม SHA ซึ่งพัฒนาโดย U.S Federal Information processing standard อัลกอริทึมเหล่านี้ปลอดภัยกว่า md5 มาก และใช้กันอย่างกว้างขวางในหลายพื้นที่ รวมถึงแอปพลิเคชันเข้ารหัส ข้อความที่สร้างโดยอัลกอริทึมเหล่านี้มีขนาด 160 ถึง 512 บิต
SHA1
SHA เป็นกลุ่มอัลกอริทึม เช่น SHA1, SHA224, SHA256, SHA384, SHA512 อัลกอริทึม SHA1 ถูกพิจารณาว่าปลอดภัยกว่า md5 และใช้กันอย่างกว้างขวางในหลายพื้นที่
ก่อนอื่น หากคุณต้องการใช้อัลกอริทึมแฮชใดๆ ให้นำเข้าโมดูล 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'}
ลองสร้างโปรแกรมง่ายๆ เพื่อเข้าใจอัลกอริทึม sha1:
import hashlib hash_obj = hashlib.sha1(b'Hello, Python!') print(hash_obj.hexdigest())
ผลลัพธ์
00d375a3693fde63e9540b91656c6ac5b5341f7c
อย่างไรก็ตาม หากคุณต้องการลำดับไบต์ที่คืนค่า คุณควรใช้ hash_obj.digest() เช่น:
import hashlib hash_obj = hashlib.sha1(b'Hello, Python!') # To generate, sequence of bytes print(hash_obj.digest())
ผลลัพธ์
b'\x00\xd3u\xa3i?\xdec\xe9T\x0b\x91elj\xc5\xb54\x1f|'
หากคุณสังเกต เราใช้ 'k' ก่อนสตริงลิเทอรัลใดๆ นี่คือการสร้างไบต์จากสตริง เนื่องจากฟังก์ชันแฮชยอมรับเฉพาะลำดับไบต์เป็นพารามิเตอร์
ในกรณีที่คุณต้องการส่งสตริงจากคอนโซล อย่าลืมเข้ารหัสสตริงเป็นลำดับไบต์:
import hashlib
mystring = input('Enter string to hash: ')
hash_obj = hashlib.sha1(mystring.encode())
print(hash_obj.hexdigest())
ผลลัพธ์
Enter string to hash: Hello, TutorialsPoint b20d14ead3e50552fc1f1cd96696b111a163dffa