如何确保在Java中销毁String对象?
我公司的员工需要通过我编写的程序来修改SQL
Server数据库中的数据。该程序首先使用Windows身份验证,我要求DBA授予该特定用户对该数据库的写访问权限。
他们不愿意这样做,而是给了 我的 Windows用户帐户写权限。
因为我信任这个人,但不足以让他在打开会话的情况下工作90分钟,所以我只向程序添加一个登录提示,询问用户名和密码的组合,然后使用它登录SQL
Server。我将登录,并信任我的应用程序,让他仅执行他需要做的事情。
但是,这带来了小的安全风险。该密码字段教程在
太阳
Oracle的网站指出,密码应保持在内存中所需要的最短时间,并为此目的,该getPassword
方法返回一个char[]
数组,一旦你用它做,你可以为零。
但是,Java的DriverManager
类仅接受String
对象作为密码,因此一旦完成密码处理,我将无法立即处理它。而且由于我的应用程序在分配和内存需求上还很低,所以谁知道它在内存中可以保留多长时间?如上所述,该程序将运行相当长的时间。
当然,我无法控制任何的SQL Server的JDBC类与我的密码,但我希望我能控制什么 我 做我的密码。
有没有String
使用Java
销毁对象或将对象归零的确定方法?我知道两者都与语言背道而驰(对象破坏是不确定的,String
对象是不可变的),并且System.gc()
也是不可预测的,但是仍然;任何想法?
回答:
所以,这是个坏消息。我很惊讶没有人提到它。使用现代垃圾收集器,甚至整个char []概念都被破坏了。不管您使用String还是char
[],数据最终都会存在谁知道多长时间的内存中。这是为什么?因为现代jvm使用世代垃圾收集器,简而言之,该垃圾收集器会在 各处复制对象
。因此,即使您使用char
[],它使用的实际内存也可能会复制到堆中的各个位置,从而使密码的副本无处不在(并且没有执行者gc会将旧内存归零)。因此,当您将最后拥有的实例清零时,您只是将内存中的最新版本清零。
长话短说,没有防弹方法来处理它。您几乎必须信任该人。
以上是 如何确保在Java中销毁String对象? 的全部内容, 来源链接: utcz.com/qa/423973.html