Question

J'utilise Oracle 9 et JDBC et souhaite coder un clob lorsqu'il est inséré dans la base de données. Idéalement, j'aimerais pouvoir simplement insérer le texte en clair et le chiffrer à l'aide d'une procédure stockée:

String SQL = "INSERT INTO table (ID, VALUE) values (?, encrypt(?))";
PreparedStatement ps = connection.prepareStatement(SQL);
ps.setInt(id);
ps.setString(plaintext);
ps.executeUpdate();

Le texte en clair ne devrait pas dépasser 4 000 caractères, mais le cryptage allonge le texte. Notre approche actuelle en matière de chiffrement utilise dbms_obfuscation_toolkit.DESEncrypt () mais nous ne traitons que varchars. Est-ce que ça va marcher?

FUNCTION encrypt(p_clob IN CLOB) RETURN CLOB
IS
    encrypted_string        CLOB;
    v_string                CLOB;
BEGIN
  dbms_lob.createtemporary(encrypted_string, TRUE);
  v_string := p_clob;
  dbms_obfuscation_toolkit.DESEncrypt(
    input_string => v_string,
    key_string => key_string,
    encrypted_string => encrypted_string );
  RETURN UTL_RAW.CAST_TO_RAW(encrypted_string);
END;

Je suis confus au sujet du clob temporaire; Dois-je le fermer? Ou suis-je totalement hors-piste?

Modifier: L'obfuscation a pour but d'empêcher un accès trivial aux données. Mon autre objectif est d’obscurcir les objets de la même manière que nous obscurcissons déjà les colonnes varchar. L'exemple de code oracle ne traite pas des clobs, c'est là que réside mon problème spécifique; Le cryptage de varchars (inférieur à 2000 caractères) est simple.

Était-ce utile?

La solution

Je remarque que vous utilisez Oracle 9, mais uniquement pour l'enregistrement dans Oracle 10g + le kit dbms_obfuscation_toolkit est devenu obsolète au profit de dbms_crypto.

dbms_crypto inclut le support CLOB :

DBMS_CRYPTO.ENCRYPT(
   dst IN OUT NOCOPY BLOB,
   src IN            CLOB         CHARACTER SET ANY_CS,
   typ IN            PLS_INTEGER,
   key IN            RAW,
       iv  IN            RAW          DEFAULT NULL);

DBMS_CRYPT.DECRYPT(
   dst IN OUT NOCOPY CLOB         CHARACTER SET ANY_CS,
   src IN            BLOB,
   typ IN            PLS_INTEGER,
   key IN            RAW,
   iv  IN            RAW          DEFAULT NULL);

Autres conseils

Il existe un exemple dans la documentation Oracle:

http://download.oracle.com /docs/cd/B10501_01/appdev.920/a96612/d_obtoo2.htm

Vous n'avez pas besoin de le fermer

DECLARE
   input_string        VARCHAR2(16) := 'tigertigertigert';
   raw_input           RAW(128) := UTL_RAW.CAST_TO_RAW(input_string);
   key_string          VARCHAR2(8)  := 'scottsco';
   raw_key             RAW(128) := UTL_RAW.CAST_TO_RAW(key_string);
   encrypted_raw               RAW(2048);
   encrypted_string            VARCHAR2(2048);
   decrypted_raw               RAW(2048);
   decrypted_string            VARCHAR2(2048); 
   error_in_input_buffer_length EXCEPTION;
   PRAGMA EXCEPTION_INIT(error_in_input_buffer_length, -28232);
   INPUT_BUFFER_LENGTH_ERR_MSG VARCHAR2(100) :=
    '*** DES INPUT BUFFER NOT A MULTIPLE OF 8 BYTES - IGNORING 
EXCEPTION ***';
   double_encrypt_not_permitted EXCEPTION;
   PRAGMA EXCEPTION_INIT(double_encrypt_not_permitted, -28233);
   DOUBLE_ENCRYPTION_ERR_MSG VARCHAR2(100) :=
    '*** CANNOT DOUBLE ENCRYPT DATA - IGNORING EXCEPTION ***';

    -- 1. Begin testing raw data encryption and decryption
       BEGIN
   dbms_output.put_line('> ========= BEGIN TEST RAW DATA =========');
   dbms_output.put_line('> Raw input                        : ' || 
             UTL_RAW.CAST_TO_VARCHAR2(raw_input));
   BEGIN 
      dbms_obfuscation_toolkit.DESEncrypt(input => raw_input, 
               key => raw_key, encrypted_data => encrypted_raw );
      dbms_output.put_line('> encrypted hex value              : ' || 
           rawtohex(encrypted_raw));
  dbms_obfuscation_toolkit.DESDecrypt(input => encrypted_raw, 
           key => raw_key, decrypted_data => decrypted_raw);
  dbms_output.put_line('> Decrypted raw output             : ' || 
                UTL_RAW.CAST_TO_VARCHAR2(decrypted_raw));
  dbms_output.put_line('>  ');      
  if UTL_RAW.CAST_TO_VARCHAR2(raw_input) = 
                UTL_RAW.CAST_TO_VARCHAR2(decrypted_raw) THEN
     dbms_output.put_line('> Raw DES Encyption and Decryption successful');
  END if;
   EXCEPTION
      WHEN error_in_input_buffer_length THEN
             dbms_output.put_line('> ' || INPUT_BUFFER_LENGTH_ERR_MSG);
   END;
   dbms_output.put_line('>  ');

Un peu hors-sujet: Quel est le but du cryptage / obscurcissement en premier lieu? Un attaquant ayant accès à votre base de données sera en mesure d'obtenir le texte en clair - la recherche de la procédure stockée ci-dessus lui permettra d'effectuer le déchiffrement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top