การเข้ารหัสข้อมูลด้วย ORACLE DBMS_CRYPTO

              ข้อมูลที่ส่งผ่านในโลกอินเตอร์เน็ตอาจมีความจำเป็นต้องเข้ารหัสข้อมูลเพื่อความปลอดภัย แม้ว่าระบบการป้องกันจะดีแค่ไหน แต่การปล่อยข้อมูลในรูปแบบที่อ่านได้ (Plain Text) ให้วิ่งผ่านเน็ตเวิร์ค ดูเป็นสิ่งที่ไม่ปลอดภัยเป็นอย่างยิ่ง

              ข้อมูลบนระบบจัดการฐานข้อมูล ORACLE มีฟังก์ชันสำหรับการเข้ารหัสข้อมูล (Encrypt) และถอดรหัสข้อมูล (Decrypt) สำหรับข้อความได้ในหลายๆ Algorithm ดังนี้

ENCRYPT_DESData Encryption Standard. Block cipher. Uses key length of 56 bits.
ENCRYPT_3DES_2KEYData Encryption Standard. Block cipher. Operates on a block 3 times with 2 keys. Effective key length of 112 bits.
ENCRYPT_3DESData Encryption Standard. Block cipher. Operates on a block 3 times.
ENCRYPT_AES128Advanced Encryption Standard. Block cipher. Uses 128-bit key size.
ENCRYPT_AES192Advanced Encryption Standard. Block cipher. Uses 192-bit key size.
ENCRYPT_AES256Advanced Encryption Standard. Block cipher. Uses 256-bit key size.
ENCRYPT_RC4Stream cipher. Uses a secret, randomly generated key unique to each session.

สำหรับตัวอย่างในวันนี้จะแสดงการเข้ารหัสข้อมูลด้วย Algorithm DES ซึ่งคีย์จะมีความยาว 56 bits

เนื่องจากการเข้ารหัสและถอดรหัสจะใช้งานคู่กัน ดังนั้นเราสามารถเขียนทั้งสองฟังก์ชันไว้ใน Package ดังนี้

CREATE OR REPLACE PACKAGE EN_DE
AS
FUNCTION ENCRYPT (p_plainText VARCHAR2) RETURN RAW DETERMINISTIC;
FUNCTION DECRYPT (p_encryptedText RAW) RETURN VARCHAR2 DETERMINISTIC;
END;
/


CREATE OR REPLACE PACKAGE BODY "EN_DE"
AS
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_DES
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
   /*
   ENCRYPT_DES is the encryption algorithem. Data Encryption Standard. Block cipher. Uses key length of 56 bits.
   CHAIN_CBC Cipher Block Chaining. Plaintext is XORed with the previous ciphertext block before it is encrypted.
   PAD_PKCS5 Provides padding which complies with the PKCS #5: Password-Based Cryptography Standard
   */
   encryption_key RAW (32) := UTL_RAW.cast_to_raw('OneTwoThree');
-- The encryption key for DES algorithem, should be 8 bytes or more. 

FUNCTION ENCRYPT (p_plainText VARCHAR2) RETURN RAW DETERMINISTIC
 IS
    encrypted_raw      RAW (32767);
 BEGIN
    encrypted_raw := DBMS_CRYPTO.ENCRYPT
    (
       src => UTL_RAW.CAST_TO_RAW (p_plainText),
       typ => encryption_type,
       KEY => encryption_key
    );
   RETURN encrypted_raw;
 END ENCRYPT;

 FUNCTION DECRYPT (p_encryptedText RAW) RETURN VARCHAR2 DETERMINISTIC
 IS
    decrypted_raw      RAW (32767);
 BEGIN
    decrypted_raw := DBMS_CRYPTO.DECRYPT
    (
        src => p_encryptedText,
        typ => encryption_type,
        KEY => encryption_key
    );
    RETURN (UTL_RAW.CAST_TO_VARCHAR2 (decrypted_raw));
 END DECRYPT;

END;
/


จากคำสั่งการสร้าง Package ข้างต้นเป็นการเข้ารหัสและถอดรหัสโดยใช้ Algorithm แบบ DES การเรียกใช้งานสามารถเรียกผ่านคำสั่งบน SQL Plus ได้ดังภาพ

จากการทำงานจะพบว่าเราสามารถเข้ารหัสข้อมูลอย่างง่ายด้วย Algorithm DES ได้ หากต้องการใช้ Algorithm อื่น สามารถเปลี่ยนค่าได้จากที่กำหนดไว้ใน Package ได้ โดยต้องคำนึงถึงขนาดของคีย์ที่เข้ารหัสด้วย เช่น AES ต้องมีขนาดคีย์เป็น 128 bits, 256 bits เป็นต้น