Question

J'ai récemment posé une question sur Oracle Encryption. Dans le but de trouver une solution pour moi-même, j'ai décidé de déplacer le chiffrement (bien, l'obscurcissement) du côté de l'application pour certaines tâches.

Mon problème, c'est que la base de données chiffre déjà les données d'une certaine manière et que j'ai besoin d'un code Java pour dupliquer cette fonctionnalité, de sorte que le texte chiffré par un système puisse être déchiffré par l'autre et vice versa.

Je souhaite que le chiffrement soit compatible avec ce que la base de données faisait déjà, mais je n'ai pas trouvé la documentation décrivant exactement ce que fait Oracle. Comment répliquer cela en 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);

Quoi que j'essaye, il semble que le cryptage Java DES soit différent de celui d'Oracle.

Était-ce utile?

La solution

J'ai trouvé cela fonctionne:

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

La pièce manquante était le vecteur d’initialisation (ips), qui doit être de 8 zéros. Lorsque vous utilisez null en Java, vous obtenez quelque chose de différent.

Autres conseils

Utiliser Java dans la base de données aurait été une autre approche qui aurait (devrait!) garantir que le code (et donc les résultats) serait identique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top