我有一个表包含nvarchar
数据类型列(包含不同语言的文本)。我想在插入表之前加密数据并在获取记录时解密数据。如何加密oracle中的nvarchar列?
请建议我如何实现这一目标。
加密和解密应该通过私钥完成。
希望,我的问题很清楚。请确认我是否需要提供更多信息。
我有一个表包含nvarchar
数据类型列(包含不同语言的文本)。我想在插入表之前加密数据并在获取记录时解密数据。如何加密oracle中的nvarchar列?
请建议我如何实现这一目标。
加密和解密应该通过私钥完成。
希望,我的问题很清楚。请确认我是否需要提供更多信息。
请注意,在应用程序中而不是在数据库中直接对数据进行加密和解密可能更为明智。
您可以使用Oracle的DBMS_CRYPTO包。文档页面中间有一个example。
首先,您需要制作一个包以从SQL表达式访问密码类型。假设你想在CBC模式下使用填充AES256:
CREATE PACKAGE pkg_so_42979606
AS
FUNCTION cipher_type RETURN PLS_INTEGER;
END pkg_so_42979606;
/
CREATE PACKAGE BODY pkg_so_42979606
AS
ctype CONSTANT PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
FUNCTION cipher_type RETURN PLS_INTEGER
IS
BEGIN
RETURN ctype;
END;
END pkg_so_42979606;
/
然后,你将需要一个密钥。您可以要求Oracle生成一个。为了轻松处理它,我将在Base64中移动它。让我们画一个:
DECLARE
key_bytes_raw RAW(32);
key_char NVARCHAR2(64);
BEGIN
key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES(32);
key_char := UTL_I18N.RAW_TO_CHAR(UTL_ENCODE.BASE64_ENCODE(key_bytes_raw), 'AL32UTF8');
DBMS_OUTPUT.PUT_LINE('Key: ' || key_char);
END;
/
Key: pMV3D4xhyfNxp3YyfLWzAErGcKkIjK3X6uc/WIeVTls=
因此,密钥我用的是pMV3D4xhyfNxp3YyfLWzAErGcKkIjK3X6uc/WIeVTls=
。
现在,我将使用一个测试表
CREATE TABLE so_42979606 (
id NUMBER PRIMARY KEY,
data NVARCHAR2(2000));
您可以将加密的数据:
INSERT INTO so_42979606
VALUES (1,
DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW('My clear data', 'AL32UTF8'),
pkg_so_42979606.cipher_type(),
UTL_ENCODE.BASE64_DECODE(UTL_I18N.STRING_TO_RAW('pMV3D4xhyfNxp3YyfLWzAErGcKkIjK3X6uc/WIeVTls=', 'AL32UTF8'))));
而且在明确检索加密的数据。
SELECT id, UTL_I18N.RAW_TO_NCHAR(DBMS_CRYPTO.DECRYPT(data,
pkg_so_42979606.cipher_type(),
UTL_ENCODE.BASE64_DECODE(UTL_I18N.STRING_TO_RAW('pMV3D4xhyfNxp3YyfLWzAErGcKkIjK3X6uc/WIeVTls=', 'AL32UTF8'))),
'AL32UTF8') data
FROM so_42979606;
ID DATA
-- ----------------------
1 My clear data
参见:[数据库高级安全管理员指南/ 3固定存储的数据借助透明数据加密(https://docs.oracle.com/cd/B28359_01/network.111/b28530/asotrans.htm#g1011122 )在Oracle帮助中心。 –
@ OlivierJacot-Descombes感谢您的建议。我无法使用透明数据加密,因为它在标准版中不可用。 – Tajinder