Я использую Oracle 9 и JDBC и хотел бы зашифровать clob, когда он вставлен в БД. В идеале я хотел бы иметь возможность просто вставить открытый текст и зашифровать его с помощью хранимой процедуры:
String SQL = "INSERT INTO table (ID, VALUE) values (?, encrypt(?))";
PreparedStatement ps = connection.prepareStatement(SQL);
ps.setInt(id);
ps.setString(plaintext);
ps.executeUpdate();
Ожидается, что открытый текст не будет превышать 4000 символов, но шифрование делает текст длиннее. Наш текущий подход к шифрованию использует dbms_obfuscation_toolkit.DESEncrypt (), но мы обрабатываем только varchars. Будет ли работать следующая?
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;
Я запутался насчет временного удара; мне нужно закрыть его? Или я совершенно не в курсе?
Edit:
Целью запутывания является предотвращение тривиального доступа к данным. Моя другая цель состоит в том, чтобы запутывать сгустки точно так же, как мы уже запутываем колонны вархаров. Пример кода оракула не имеет дело с сабо, где моя конкретная проблема лежит; шифрование VARCHARS (меньше чем 2000 символов) не вызывает затруднений.