2017-03-23 6 views
-1

nvarcharデータ型の列(異なる言語のテキストを含む)を含む表があります。私はテーブルに挿入する前にデータを暗号化し、レコードをフェッチしている間に同じデータを解読したい。oracleでnvarchar列を暗号化する方法は?

どうすればいいですか?

暗号化と復号化は、秘密鍵で行う必要があります。

私の質問は明らかです。詳しい情報を提供する必要があるかどうかを確認してください。

+0

を参照してください:[Database Advanced Security管理者ガイド/ 3透過的データ暗号化を使用して格納されたデータの保護](https://docs.oracle.com/cd/B28359_01/network.111/b28530/asotrans.htm#g1011122 )をOracle Help Centerに追加します。 –

+0

@ OlivierJacot-Descombesご意見ありがとうございます。私は標準のエディションでは利用できないため、透過的なデータ暗号化は使用できません。 – Tajinder

答えて

0

データベースではなく、アプリケーションで直接データを暗号化して解読する方が賢明かもしれないことに注意してください。

OracleのDBMS_CRYPTOパッケージを使用できます。ドキュメントページの中央にはexampleがあります。

まず、SQL式から暗号タイプにアクセスするパッケージを作成する必要があります。たとえば、ABC256を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=です。

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')))); 

とクリアで暗号化されたデータを取得する:

今、私はあなたが暗号化されたデータを挿入することができ、テストテーブル

CREATE TABLE so_42979606 (
    id NUMBER PRIMARY KEY, 
    data NVARCHAR2(2000)); 

を使用します。

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

関連する問題