2017-03-23 51 views
-1

我有一个表包含nvarchar数据类型列(包含不同语言的文本)。我想在插入表之前加密数据并在获取记录时解密数据。如何加密oracle中的nvarchar列?

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

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

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

+0

参见:[数据库高级安全管理员指南/ 3固定存储的数据借助透明数据加密(https://docs.oracle.com/cd/B28359_01/network.111/b28530/asotrans.htm#g1011122 )在Oracle帮助中心。 –

+0

@ OlivierJacot-Descombes感谢您的建议。我无法使用透明数据加密,因为它在标准版中不可用。 – Tajinder

回答

0

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

您可以使用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 
+0

感谢您的时间。尝试相同,当与其他语言文本使用nvarchar列时返回无效数据'???'。 – Tajinder

+0

@Tajinder我编辑添加一个完整的示例。希望能帮助到你。 – kmkaplan

+0

另外请注意,如果您放宽了将数据存储在'RAW'列的要求,那么您将节省一些'UTL_I18N'投射。 – kmkaplan