2017-03-23 2 views
-1

Ich habe eine Tabelle mit Datentyp Spalten (enthält Text in verschiedenen Sprachen). Ich möchte Daten vor dem Einfügen in eine Tabelle verschlüsseln und beim Abrufen von Datensätzen entschlüsseln.Wie zu verschlüsseln nvarchar Spalte in Oracle?

Bitte schlagen Sie vor, wie ich das erreichen kann.

Die Verschlüsselung und Entschlüsselung sollte über einen privaten Schlüssel erfolgen.

In der Hoffnung, meine Frage ist klar. Bitte bestätigen Sie, wenn ich weitere Informationen bereitstellen muss.

+0

Siehe auch: [Datenbank Advanced Security Administrator-Handbuch/3 Absichern gespeicherter Daten Transparent Data Encryption verwenden] (https://docs.oracle.com/cd/B28359_01/network.111/b28530/asotrans.htm#g1011122) in der Oracle Hilfe. –

+0

@ OlivierJacot-Descombes Vielen Dank für Ihren Vorschlag. Ich kann die transparente Datenverschlüsselung nicht verwenden, da sie in der Standard Edition nicht verfügbar ist. – Tajinder

Antwort

0

Beachten Sie, dass es wahrscheinlich klüger ist, Ihre Daten direkt in Ihrer Anwendung und nicht in der Datenbank zu verschlüsseln und zu entschlüsseln.

Sie können Oracles DBMS_CRYPTO Paket verwenden. In der Mitte der Dokumentationsseite befindet sich ein example.

Zuerst müssen Sie ein Paket erstellen, um vom SQL-Ausdruck auf den Chiffre-Typ zuzugreifen. Nehmen wir an, Sie möchten AES256 im CBC-Modus mit Auffüllen:

Dann benötigen Sie einen Schlüssel. Sie können Oracle bitten, eins zu erzeugen. Um es einfach zu handhaben, verschiebe ich es in Base64. Lassen Sie sich ziehen ein:

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= 

So ist der Chiffrierschlüssel ich werde pMV3D4xhyfNxp3YyfLWzAErGcKkIjK3X6uc/WIeVTls= ist.

Jetzt werde ich eine Testtabelle verwenden

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

Sie können verschlüsselte Daten einfügen:

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

Und die verschlüsselten Daten im Klar abrufen.

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

Danke für Ihre Zeit. Gleiches versuchen, Rückgabe Ungültige Daten '???' bei der Verwendung von nvarchar Spalte mit anderen Sprachen Text. – Tajinder

+0

@Tajinder ich bearbeitet, um ein vollständiges Beispiel hinzuzufügen. Ich hoffe es hilft. – kmkaplan

+0

Beachten Sie auch, dass Sie, wenn Sie Ihre Anforderung zum Speichern der Daten in 'RAW'-Spalten entspannen, ein paar 'UTL_I18N'-Castings speichern. – kmkaplan