在数据库应用中,数据的安全性和隐私保护变得越来越重要。为了防止敏感数据泄露,常常需要对数据进行加密。本文将介绍如何在 Oracle 数据库中使用 AES 加密技术保护敏感数据,并通过创建函数和触发器实现自动加密和解密。
背景随着数据隐私法规的日益严格,企业在存储和处理客户数据时,必须采取有效的措施来保护敏感信息。AES(Advanced Encryption Standard)是一种广泛应用的加密标准,具有高效和安全的特点。在 Oracle 数据库中,DBMS_CRYPTO 包提供了 AES 加密和解密功能,可以方便地对数据进行保护。
赋予用户权限在开始加密操作之前,需要确保用户具有执行加密相关操作的权限。首先,赋予 scott 用户必要的权限:
GRANT EXECUTE ON sys.dbms_crypto TO scott;GRANT EXECUTE ON sys.UTL_I18N TO scott;创建测试表接下来,创建一个测试表 emp_mobile,用于存储员工的手机号码:
CREATE TABLE emp_mobile (empno NUMBER, mobile VARCHAR2(40) NOT NULL);加密函数定义一个加密函数 FUNC_ENCRYPTION,使用 AES 算法对输入的字符串进行加密:
create or replace FUNCTION FUNC_ENCRYPTION(V_STR VARCHAR2)RETURN VARCHAR2ASV_KEY_RAW RAW(16) ;V_STR_RAW RAW(2000) ;V_RETURN_STR VARCHAR2(2000) ;V_TYPE PLS_INTEGER ;BEGIN IF V_STR IS NULL OR V_STR = 'null' THEN BEGIN RETURN V_STR; END; ELSE BEGIN V_KEY_RAW := UTL_I18N.STRING_TO_RAW('encryptionkey123','UTF8') ; -- 自定义加密key,16位 V_STR_RAW := UTL_I18N.STRING_TO_RAW(V_STR,'UTF8') ; V_TYPE := DBMS_CRYPTO.ENCRYPT_AES128+DBMS_CRYPTO.CHAIN_ECB+DBMS_CRYPTO.PAD_PKCS5 ; V_STR_RAW := DBMS_CRYPTO.ENCRYPT(SRC => V_STR_RAW , typ => V_TYPE, key => V_KEY_RAW) ; V_RETURN_STR := utl_raw.cast_to_varchar2(utl_encode.base64_encode(V_STR_RAW)); RETURN V_RETURN_STR ; END; END IF ;END;/解密函数定义一个解密函数 FUNC_DECRYPTION,使用 AES 算法对加密的字符串进行解密:
CREATE OR REPLACE FUNCTION FUNC_DECRYPTION(V_STR VARCHAR2)RETURN VARCHAR2AS V_KEY_RAW RAW(16); V_STR_RAW RAW(2000); V_RETURN_STR VARCHAR2(2000); V_TYPE PLS_INTEGER;BEGIN IF V_STR IS NULL OR V_STR = 'null' THEN RETURN V_STR; ELSE V_KEY_RAW := UTL_I18N.STRING_TO_RAW('encryptionkey123','UTF8'); -- 解密key V_STR_RAW := UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(V_STR)); V_TYPE := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5; V_STR_RAW := DBMS_CRYPTO.DECRYPT(SRC => V_STR_RAW, typ => V_TYPE, key => V_KEY_RAW); V_RETURN_STR := UTL_I18N.RAW_TO_CHAR(V_STR_RAW,'UTF8'); RETURN V_RETURN_STR; END IF;END;/创建触发器创建一个触发器 trg_emp_mobile,在插入或更新数据时自动加密 mobile 字段:
CREATE OR REPLACE TRIGGER trg_emp_mobileBEFORE INSERT OR UPDATE ON emp_mobileFOR EACH ROWDECLAREBEGIN :NEW.mobile := FUNC_ENCRYPTION(:NEW.mobile);END;/测试加密和解密功能插入数据并查看加密后的结果:
INSERT INTO emp_mobile VALUES (1, '13100010001');commit;SELECT * FROM emp_mobile;-- 输出示例:-- EMPNO MOBILE-- ------- ---------------------------- 1 ZOTyCzKxL/D1dJfdUQTz8A==更新数据并查看加密后的结果:
update emp_mobile set mobile='13100010002' where empno=1;commit;SELECT * FROM emp_mobile;-- 输出示例:-- EMPNO MOBILE-- ---------- ---------------------------- 1 5iQEe6OgSFpC8EbSjUhV8Q==使用解密函数查看原始数据:
SELECT FUNC_DECRYPTION('ZOTyCzKxL/D1dJfdUQTz8A==') from dual;-- 输出示例:-- EMPNO MOBILE-- ------- -------------- 1 13100010001SELECT FUNC_DECRYPTION('5iQEe6OgSFpC8EbSjUhV8Q==') from dual;-- 输出示例:-- EMPNO MOBILE-- ------- -------------- 1 13100010002总结通过本文的介绍,我们了解了如何在 Oracle 数据库中使用 AES 加密技术保护敏感数据,并通过创建加密和解密函数以及触发器,实现数据的自动加密和解密。AES 加密可以有效地保护数据隐私,防止敏感信息泄露。希望本文能够帮助您在 Oracle 数据库中实现数据加密,提升数据安全性。
「欢迎关注我们的公众号,获取更多技术分享与经验交流。」