【问题标题】:Using Jooq to set a Character Array instead of String使用 Jooq 设置字符数组而不是字符串
【发布时间】:2018-03-30 15:36:53
【问题描述】:

我有一个设置敏感信息的 Jooq 更新查询。敏感信息是一个 char[],然后我用 Arrays.fill(characterArray, '0') 将其归零。

为了通过 Jooq 设置该值,我必须将该字符数组转换为字符串,这首先会破坏字符数组的目的,因为它会在内存中创建一个不可变的字符串,我会任由垃圾收集摆布。

有没有办法让 Jooq 将该值设置为字符数组而不先将其转换为字符串?

【问题讨论】:

  • 为了做到这一点,您有一个类似于char[] 类型的全局变量,您在其中放置了某个给定点的敏感信息,并且您希望 jOOQ 读取该信息合适的时机并将其发送给 JDBC 驱动程序? char[] 如何比字符串更安全?
  • 所以我收到了 char[] 类型的数据,然后在数据库中设置后将其清零。所以它只在服务的记忆中是安全的(松散地说,只是一个缩短的机会窗口)。我知道这只是杯水车薪,在其他领域也同样不安全,但每一点都有帮助。我只是问,因为我在其他任何地方都找不到答案。
  • 哦,我明白了,所以归零与 jOOQ 并不真正相关,您只是将其作为一些额外的上下文信息提供。本质上,您想将char[] 绑定到数据库中的VARCHAR 列,对吗?
  • 是的,正确。抱歉,我的解释从来没有像我最初设想的那样进行。 :)
  • 是的,提出一个好问题需要练习 :) 但这就是这个平台的目的。问更多问题,它会变得更好。

标签: java arrays string jooq


【解决方案1】:

这里的适当方法是为您的VARCHAR 列(jOOQ 将其视为String)和您的“用户定义类型”char[] 创建一个data type binding。实现方式如下:

public class CharArrayBinding implements Binding<String, char[]> {
    //                                           ^^^^^^  ^^^^^^
    // JDBC / database type ------------------------+       |
    // user facing type     --------------------------------+

    @Override
    public void set(BindingSetStatementContext<char[]> ctx) {
        ctx.statement().setCharacterStream(
            ctx.index(), 
            new java.io.CharArrayReader(ctx.value())
        );
    }

    ...
}

That binding could then be associated with your relevant columns by the code generator.

现在,有更多的方法可以实现,但上面已经展示了你可以如何进行的想法。

一些注意事项:

我不完全理解您的要求,所以我选择的CharArrayReader 可能仍然不适合您的需求。此外,不能保证您的 JDBC 驱动程序可能不会执行一些额外的分配,这可能会或可能不会影响您的要求。我个人更喜欢将加密用于这些目的,但同样,这可能不适合您的需求。

尽管如此,通过使用数据类型绑定,您可以覆盖 jOOQ 的内部结构,并且您的绑定变量上不会有任何 String 分配,由 jOOQ 执行。

【讨论】:

    猜你喜欢
    • 2013-09-19
    • 2010-12-29
    • 1970-01-01
    • 2022-01-25
    • 2016-06-19
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多