2017-03-23 3 views
-1

J'ai une table contenant nvarchar colonnes de type de données (contient du texte dans différentes langues). Je veux chiffrer les données avant de les insérer dans la table et les décrypter tout en récupérant les enregistrements.Comment crypter la colonne nvarchar dans Oracle?

S'il vous plaît suggérer comment je peux y parvenir.

Le cryptage et le décryptage doivent être effectués à l'aide d'une clé privée.

En espérant, ma question est claire. S'il vous plaît confirmer si j'ai besoin de fournir plus d'informations.

+0

Voir: [Base de données de sécurité avancée Guide de l'administrateur/3 de Securing Utilisation des données stockées Transparent Data Encryption] (https://docs.oracle.com/cd/B28359_01/network.111/b28530/asotrans.htm#g1011122) sur le Centre d'aide Oracle. –

+0

@ OlivierJacot-Descombes Merci pour votre suggestion. Je ne peux pas utiliser le chiffrement de données transparent car il n'est pas disponible en édition standard. – Tajinder

Répondre

0

Notez qu'il est probablement plus sage de crypter et de déchiffrer vos données directement dans votre application plutôt que dans la base de données. Vous pouvez utiliser le package DBMS_CRYPTO d'Oracle. Il y a un example au milieu de la page de documentation.

Vous devez d'abord créer un package pour accéder au type de chiffrement à partir de l'expression SQL. Disons que vous voulez AES256 en mode CBC avec rembourrage:

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; 
/

Ensuite, vous aurez besoin d'une clé. Vous pouvez demander à Oracle d'en générer un. Pour le manipuler facilement, je le déplacerai en Base64. Tirons un:

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= 

Ainsi, la clé de chiffrement, je vais utiliser est pMV3D4xhyfNxp3YyfLWzAErGcKkIjK3X6uc/WIeVTls=.

Maintenant, je vais utiliser une table de test

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

Vous pouvez insérer des données cryptées:

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

et récupérer les données chiffrées en clair.

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

Merci pour votre temps. en essayant pareil, en retournant les données invalides '???' en utilisant la colonne nvarchar avec le texte d'autres langues. – Tajinder

+0

@Tajinder J'ai modifié pour ajouter un exemple complet. J'espère que cela aide. – kmkaplan

+0

Notez également que si vous relâchez votre obligation de stocker les données dans les colonnes 'RAW', vous sauvegarderez une partie' 'UTL_I18N'. – kmkaplan