暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Oracle中使用AES加密保护敏感数据

数据库驾驶舱 2024-06-01
1085

在数据库应用中,数据的安全性和隐私保护变得越来越重要。为了防止敏感数据泄露,常常需要对数据进行加密。本文将介绍如何在 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(40NOT 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论