Nattawut Phetmak
Jack of all Trades
การเข้ารหัสข้อความแบบ hash สามารถทำได้โดยการเรียก
import hashlib
แล้วจึงสร้าง object ของการเข้ารหัสแบบที่ต้องการ เช่น ประกาศ
m = hashlib.md5()
s = hashlib.sha1()
สำหรับการเรียกใช้ จะส่งผ่านข้อความที่ต้องการหา hash เข้าไปเก็บไว้ แล้วจึงสั่งให้พิมพ์ค่าออกมา
m.update("quick brown fox ")
m.update("and a lazy dog.")
print(repr(m.digest()))
# out: \xde\xb4l\xb5]\xaa\xbc\x90\x7f\xc5\xd2\x86\xf7\xe3\x9aJ
สังเกตว่าก่อนที่จะพิมพ์ค่าออกมาดูนั้น เราควรผ่านฟังก์ชัน repr()
เสียก่อน เพื่อให้ผลลัพท์ที่ออกมาอ่านง่ายขึ้น
อนึ่ง ในกรณีที่ข้อความไม่ยาวมาก ไม่อยาก update
หลายครั้ง จะสั่งเช่นนี้ก็ได้
myhash = hashlib.md5("quick brown fox and a lazy dog.").digest()
print(repr(myhash))
# same output as above.
ส่วนการเข้ารหัส hash แบบมี key ทำได้คือ
import hmac
key = 'ceasar'
msg = 'attack rome today'
m = hmac.new(key, msg)
print(repr(m.degest()))
# out: t\xf4\x1fyrv\xa3)B\xe9ku\x1fmF\x1e
ซึ่งจะได้ผลลัพท์เข้ารหัสแบบ MD5 ถ้าต้องการใช้วิธีเข้ารหัสแบบอื่น ให้ระบุวิธีเข้ารหัสลงไปในรูปแบบของ function callback เช่นนี้
s = hmac.new(key, msg, hashlib.sha1)
print(repr(s.degest()))
# out: x9d\x11c\xb2\xe1gYP\x9c3\xd4\x19\x19\x17\x8a\xdf\x9f6\xa2\x97
ผลลัพท์จากข้างต้นนั้น จะออกมาเป็นอักษรในฐาน 16 เสมอ แต่ส่วนมากเราต้องใช้ฐาน 64 ก็สามารถทำได้โดย
import base64
print(base64.b64encode(myhash))
# output: 3rRstV2qvJB/xdKG9+OaSg==
ซึ่งเลขในฐาน 64 นี้ จะเริ่มจาก A-Z ตามด้วย a-z และ 0-9 ส่วนสองตัวสุดท้ายจะใช้ + และ / สำหรับ = จะใช้แทนอักษรว่างสำหรับเติมให้ประโยคมีตัวอักษรหารสามลงตัว ถ้าเราต้องการกำหนด 2 ตัวสุดท้ายเองก็ย่อมทำได้คือ
print(base64.b64encode(myhash, '-_'))
# output: 3rRstV2qvJB_xdKG9-OaSg==
หรือเพื่อความรวดเร็วในกรณีที่ต้องการผลลัพท์สำหรับเว็บไซต์ (เช่นข้างบน) จะเรียกฟังก์สำเร็จนี้
print(base64.urlsafe_b64encode(myhash))
# output same as above
ส่วนการ decode ก็ทำได้เช่นเดียวกับการ encode ครับ
print(repr(base64.b64decode('3rRstV2qvJB/xdKG9+OaSg==')))
# output: \xde\xb4l\xb5]\xaa\xbc\x90\x7f\xc5\xd2\x86\xf7\xe3\x9aJ