2017-03-23 53 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