【问题标题】:Duplicate Oracle DES encrypting in JavaJava 中的重复 Oracle DES 加密
【发布时间】:2010-09-12 01:04:33
【问题描述】:

我最近问了一个关于 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 的不同。

【问题讨论】:

    标签: java oracle encryption


    【解决方案1】:

    我发现这是可行的:

    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 时,你会得到不同的东西。

    【讨论】:

    • 1.固定IV意味着对于同一个明文块,第一个块(8字节)的密文总是相同的——第一个块可能受到字典攻击。 2. CBC模式意味着攻击者可以很容易地在解码后的明文中执行bitflips(但运行它之前的明文块)。
    • 正如我在问题中所说,这更多地用于混淆而不是真正的加密。无论如何,固定的 IV 是不可避免的,因为这就是 Oracle 所做的。
    【解决方案2】:

    在数据库中使用 Java 是另一种方法,它(应该!)保证代码(以及结果)是相同的。

    【讨论】:

    • 是的,但不幸的是,在这种情况下,我被问题中描述的现有加密算法所困扰。我需要做的正是在 Java 中所做的事情。在实践中,我认为更现代的 Oracle 加密可以与 Java 等外国加密库完全互操作。
    猜你喜欢
    • 2012-05-06
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多