我有一個表包含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