Quel est le meilleur moyen de chiffrer un clob?
-
01-07-2019 - |
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.
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.