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本来是应该(应该!)保证代码(因此结果)相同的另一种方法。