【发布时间】:2011-07-11 10:07:56
【问题描述】:
我公司的一名员工需要通过我制作的程序修改 SQL Server 数据库中的数据。该程序最初使用 Windows 身份验证,我要求 DBA 授予该特定用户对所述数据库的写入权限。
他们不愿意这样做,而是授予对 my Windows 用户帐户的写入权限。
由于我信任这个人,但不足以让他在我的会话打开的情况下工作 90 分钟,我将在我的程序中添加一个登录提示,要求输入用户名和密码组合,然后使用它登录 SQL Server .我会登录并相信我的应用程序会让他只做他需要做的事情。
但是,这会带来很小的安全风险。 SunOracle 网站上的 password fields tutorial 声明密码应在内存中保留所需的最短时间,为此,getPassword 方法返回一个 char[] 数组,您可以将其归零完成后。
但是,Java 的 DriverManager 类只接受 String 对象作为密码,所以我无法在完成密码后立即处理它。而且由于我的应用程序在分配和内存要求上偶然非常低,谁知道它会在内存中存活多久?如上所述,该程序将运行相当长的时间。
当然,我无法控制 SQL Server JDBC 类用我的密码做什么,但我希望我可以控制 我用我的密码做什么。
有没有一种万无一失的方法可以用 Java 销毁/清零 String 对象?我知道两者都有点反对语言(对象破坏是不确定的,String 对象是不可变的),System.gc() 也有点不可预测,但仍然;有什么想法吗?
【问题讨论】:
-
所以你假设一个邪恶的人可以偷看你的应用程序的内存,你想在那种情况下打败他?您正试图为不可能的威胁找到不可能的解决方案。作恶者有更简单的方法来获取密码,如果他有那种访问计算机的权限。唯一有效的解决办法是用一顶大锡箔帽把电脑屏蔽起来。
-
不言而喻,但我相信您知道许多公司对密码共享有严格的政策。当然,我们都会时不时地这样做——但持续地升级问题并设置您需要的帐户并不是更简单的途径。我想反思可能是采用的途径 - 正如其他人所回答的那样。
-
@irreputable 我不得不同意在这种情况下它并不重要(因为我已经对答案发表了评论),但如果我遇到更偏执的环境,这种情况可能再次发生。
-
现实吗?只有您了解您的用户。但如果我是你,我会提供一个远程接口。如果他可以访问正在运行您的应用程序的计算机,并且他那么足智多谋和坚定,那么您就是干杯。
-
@irreputable 在我的情况下这不现实,用户是个好人。问这个问题是否不合适?