Pergunta

Eu recentemente fez uma pergunta sobre a Oracle Encryption. Ao longo do caminho para encontrar uma solução para mim eu decidi mudar a criptografia (bem, ofuscação) para o lado da aplicação para determinadas tarefas.

Meu problema é que o banco de dados já está criptografando os dados de uma determinada maneira e eu preciso de código Java para duplicar essa funcionalidade, para que o texto criptografado por um sistema pode ser decifrada pelo outro e vice-versa.

Eu quero a criptografia para ser compatível com o que a DB já estava fazendo, mas não conseguiu encontrar a documentação que descreve exatamente o que a Oracle está fazendo. Como faço para replicar isso em 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);

Não importa o que eu tente, parece como se a criptografia Java DES é diferente da Oracle.

Foi útil?

Solução

Eu achei isso funciona:

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);

A peça que faltava era o vetor de inicialização (IPS), que deve ser de 8 zeros. Quando você usa nulo em Java você tem algo diferente.

Outras dicas

Usando Java no banco de dados teria sido outra abordagem que (deve!) Têm guarenteed que o código (e, portanto, resultados) seriam idênticos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top