Дублирование шифрования Oracle DES в Java
-
02-07-2019 - |
Вопрос
Недавно я задал вопрос о шифровании 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 в базе данных было бы еще одним подходом, который гарантировал бы (и должен был!) идентичность кода (и, следовательно, результатов).