gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:48:25 24 4
gpt4 key购买 nike

我公司的一名员工需要通过我制作的程序修改 SQL Server 数据库中的数据。该程序最初使用 Windows 身份验证,我要求 DBA 授予该特定用户对所述数据库的写入权限。

他们不愿意这样做,而是授予对 my Windows 用户帐户的写入权限。

由于我信任这个人,但不足以让他在我的 session 打开的情况下工作 90 分钟,我将在我的程序中添加一个登录提示,要求输入用户名和密码组合,然后使用它登录到 SQL Server .我会登录并相信我的应用程序会让他只做他需要做的事情。

但是,这会带来很小的安全风险。 password fields tutorial Sun Oracle 的网站上指出,密码应在内存中保留所需的最短时间,为此,getPassword 方法返回一个 char[] 数组,一旦你完成它就可以归零。

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

当然,我无法控制 SQL Server JDBC 类用我的密码做什么,但我希望我可以控制 用我的密码做什么。

有没有一种万无一失的方法可以用 Java 销毁/清零 String 对象?我知道这两种语言都有点违反语言(对象破坏是不确定的,String 对象是不可变的),System.gc() 也有点不可预测,但仍然;有什么想法吗?

最佳答案

所以,这是个坏消息。我很惊讶还没有人提到它。使用现代垃圾收集器,甚至整个 char[] 概念都被打破了。无论您使用 String 还是 char[],数据最终都会在内存中保存多久。这是为什么?因为现代 jvm 使用分代垃圾收集器,简而言之,将对象复制到所有地方。因此,即使您使用 char[],它使用的实际内存也可能会被复制到堆中的各个位置,从而在任何地方留下密码副本(并且没有高性能 gc 会将旧内存归零)。因此,当您将最后拥有的实例清零时,您只是将内存中的最新版本清零。

长话短说,没有万无一失的方法来处理它。你几乎必须信任这个人。

关于java - 如何确保在 Java 中销毁 String 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5238131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com