如何在oracle中加密nvarchar列?

时间:2017-03-23 14:52:57

标签: oracle encryption oracle11g encryption-symmetric

我有一个包含nvarchar数据类型列的表(包含不同语言的文本)。我希望在插入表之前加密数据,并在获取记录时对其进行解密。

请建议我如何实现这一目标。

加密和解密应该通过私钥完成。

希望,我的问题很清楚。请确认我是否需要提供更多信息。

1 个答案:

答案 0 :(得分:2)

请注意,在应用程序中而不是在数据库中直接加密和解密数据可能更为明智。

您可以使用Oracle的DBMS_CRYPTO包。文档页面中间有一个example

首先,您需要创建一个包来从SQL表达式访问密码类型。假设您希望AES256在CBC模式下使用填充:

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