Java中重复的Oracle DES加密

时间:2020-03-06 14:32:44  来源:igfitidea点击:

我最近问了一个有关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个零。在Java中使用null时,会得到一些不同的结果。

在数据库中使用Java本来是应该(应该!)保证代码(因此结果)相同的另一种方法。