我最近问了一个关于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本来是另一种方法(应该!)保证代码(以及结果)是相同的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top