Вопрос

Недавно я задал вопрос о шифровании Oracle.По пути поиска решения для себя я решил перенести шифрование (ну, обфускацию) на сторону приложения для определённых задач.

Моя проблема в том, что база данных уже шифрует данные определенным образом, и мне нужен код Java для дублирования этой функциональности, чтобы текст, зашифрованный одной системой, мог быть расшифрован другой, и наоборот.

Я хочу, чтобы шифрование было совместимо с тем, что уже делала БД, но не смог найти документацию, которая точно описывает, что делает Oracle.Как мне повторить это на Java?

dbms_obfuscation_toolkit.DESEncrypt(
  input_string => v_string,
  key_string => key_string,
  encrypted_string => encrypted_string );
RETURN UTL_RAW.CAST_TO_RAW(encrypted_string);

Что бы я ни пытался, кажется, что шифрование Java DES отличается от шифрования Oracle.

Это было полезно?

Решение

Я нашел, что это работает:

KeySpec ks = new DESKeySpec(new byte[] {'s','e','c','r','e','t','!','!'});
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = skf.generateSecret(ks);
Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
IvParameterSpec ips = new IvParameterSpec(new byte[] {0,0,0,0,0,0,0,0});
c.init(Cipher.ENCRYPT, sk, ips);
// or
c.init(Cipher.DECRYPT, sk, ips);

Недостающей частью был вектор инициализации (ips), который должен состоять из 8 нулей.Когда вы используете null в Java, вы получаете что-то другое.

Другие советы

Использование Java в базе данных было бы еще одним подходом, который гарантировал бы (и должен был!) идентичность кода (и, следовательно, результатов).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top