在数据库应用中,数据的安全性和隐私保护变得越来越重要。为了防止敏感数据泄露,常常需要对数据进行加密。本文将介绍如何在 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 VARCHAR2
AS
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
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 VARCHAR2
AS
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_mobile
BEFORE INSERT OR UPDATE ON emp_mobile
FOR EACH ROW
DECLARE
BEGIN
: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 13100010001
SELECT FUNC_DECRYPTION('5iQEe6OgSFpC8EbSjUhV8Q==') from dual;
-- 输出示例:
-- EMPNO MOBILE
-- ------- ------------
-- 1 13100010002
总结
通过本文的介绍,我们了解了如何在 Oracle 数据库中使用 AES 加密技术保护敏感数据,并通过创建加密和解密函数以及触发器,实现数据的自动加密和解密。AES 加密可以有效地保护数据隐私,防止敏感信息泄露。希望本文能够帮助您在 Oracle 数据库中实现数据加密,提升数据安全性。
「欢迎关注我们的公众号,获取更多技术分享与经验交流。」
文章转载自数据库驾驶舱,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




