Base64

การเข้ารหัสข้อความแบบ 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

Nattawut Phetmak

Jack of all Trades

blog comments powered by Disqus