相关疑难解决方法(0)

如何确保在Java中销毁String对象?

我公司的员工需要通过我制作的程序修改SQL Server数据库中的数据.该程序首先使用Windows身份验证,我要求DBA为此特定用户提供对所述数据库的写访问权限.

他们不愿意这样做,而是给我的 Windows用户帐户提供写访问权限.

因为我相信这个人但是还不足以让他在我的会话打开的情况下工作90分钟,我只会在我的程序中添加一个登录提示,要求输入用户名和密码,然后使用它登录到SQL Server.我会登录,并相信我的应用程序让他只做他需要的东西.

然而,这会带来很小的安全风险.该密码字段教程太阳 Oracle的网站指出,密码应保持在内存中所需要的最短时间,并为此目的,该getPassword方法返回一个char[]数组,一旦你用它做,你可以零.

但是,Java的DriverManager类只接受String对象作为密码,所以一旦我完成它,我将无法处理密码.而且由于我的应用程序在分配和内存要求方面非常低,谁知道它能在内存中存活多久?如上所述,该程序将运行相当长的时间.

当然,我无法控制任何的SQL Server的JDBC类与我的密码,但我希望我能控制什么做我的密码.

有没有一种可靠的方法来破坏/清除StringJava对象?我知道两者都有点违背语言(对象破坏是非确定性的,String对象是不可变的),并且System.gc()有点不可预测,但仍然存在; 任何的想法?

java security

38
推荐指数
3
解决办法
7533
查看次数

如何在JVM上安全地处理和清零密钥材料缓冲区?

我正在为执行加密操作的JVM(在Clojure中)编写软件.具体地,给定秘密输入,秘密密钥,非秘密盐,非秘密个性化,它使用BLAKE2来导出512位密钥材料.然后使用Arrays该类中的工具将该阵列切换为两个256位块.(来源)

该操作的实际实现住在libsodium所以它用C实现我用来访问它,这是在包装,使用图书馆JNR-FFI调用底层的C实现.

由于上面的所有缓冲区都有敏感的密钥材料,我想确保它从内存中清除.我不确定如何在JVM上安全地做到这一点(哎呀,我甚至不知道如何在C中安全地做到这一点).鉴于材料从C转换const char *为JVM byte[],然后我的一些操作生成新的JVM字节数组,密钥材料将存在于JVM字节数组中.这引起了两个问题:

  • 如果我zerofill a byte[],之后没有被任何代码触及,我怎么能确定它byte[]实际上被清零了?我假设JVM可以自由地优化它.
  • 就算我是能够保证byte[]被零,我怎么知道JVM还没有决定到阵列复制(如垃圾回收器的情况下)很多次,不归零原来的位置,因此留下键控无论如何,虚拟内存的材料?

我猜测答案将最终成为"在C&ASM中做到"或者甚至"在HSM中做",但我很想知道是否有JVM-land方法来解决这个问题.

java security jvm cryptography clojure

7
推荐指数
1
解决办法
186
查看次数

标签 统计

java ×2

security ×2

clojure ×1

cryptography ×1

jvm ×1