通过 Java 在 Windows 中存储密码的位置
Posted
技术标签:
【中文标题】通过 Java 在 Windows 中存储密码的位置【英文标题】:Where to store passwords in Windows via Java 【发布时间】:2014-12-11 14:56:03 【问题描述】:我正在创建一个基于 Java 的桌面应用程序。 我需要在其中存储一个密码,以便每当有人尝试访问该应用程序时,它都会要求输入密码。我已经使用 BCrypt 加密了密码,所以它(希望)是安全的。
但是,我需要将密码存储在安全的地方。最初,我考虑将其存储在 Windows 注册表中(因为我的应用程序是特定于 Windows 的)。但是,任何人都可以编辑或删除注册表项,这是非常不安全的。
因此,我需要将密码存放在用户无法访问或修改(绝对不能删除)的地方。
存储(已经加密的)密码最安全的方法是什么? 如果您是 Java 特定的,那将很有帮助。
编辑
有人指出我应该使用数据库来安全地存储密码。 我试了一下,成功将密码存入数据库,并进一步找回。 但是,即使数据库也需要存储在某个地方,因此如果数据库被删除,密码也会被删除。因此这是不安全的。 在这种情况下我应该怎么做?
【问题讨论】:
为什么不使用数据库? 字面上写的是@Karthikeyan - 毕竟,它们旨在安全地存储数据 @MrCoder - 我尝试过使用数据库,但是,即使数据库也需要存储在某个地方,如果数据库被删除,密码也会消失!我现在该怎么办? @Karthikeyan - 我尝试过使用数据库,但是,即使数据库也需要存储在某个地方,如果数据库被删除,密码也会消失!我现在该怎么办? @PratanuMandal,将数据库存储在云中怎么样?你考虑过那个选项吗?另外,如果您将数据库设为只读,那会不会更安全? 【参考方案1】:我建议你使用数据库。
我给你一个链接,它向你展示了如何在 Java 中使用 mysql 数据库。
http://www.lionblogger.com/java-application-mysql-database/
希望这能解决您的问题。
【讨论】:
我尝试过使用数据库,但是,即使数据库也需要存储在某个地方,如果数据库被删除,密码也没有了!我现在该怎么办? 不。最初的问题表明数据应该在用户的计算机上。此外,任何程序都可以通过获取用户密码访问该数据库。【参考方案2】:Windows 存储其密码的位置(仍然可能被“破解/黑客”):
Windows 将其密码存储在所谓的安全帐户管理器数据库或 SAM 数据库中。
这是一个存在于注册表中的文件,在 windows 运行时对其的访问受到严格控制;但是,可以以 NT AUTHORITY\SYSTEM 身份运行进程的本地管理员可以访问它 - 看看 NT 将 SAM 数据库存储在哪里?
你能不能不使用这样的东西(即使它是一个数据库,你似乎对此感到厌烦)?
选项
除此之外,您为什么不在受密码保护的 数据库上运行此程序,在该数据库中需要进行身份验证才能编辑/删除? - 这可能是最明智的选择
但是,如果您仍然希望“存储”您的密码,我想引用以下内容:
不要发明自己的“聪明”密码存储方案。我知道, 你很聪明,而且你很了解这些加密货币。但是通过这扇门 谎言疯狂——以及持续存在的像 LMHash 这样的可憎之事, 我们今天仍在处理的全球安全后果。拿 利用您的框架提供的任何密码存储工具, 因为它们可能会经过更好的测试,甚至更多 比您和您的团队想出的任何疯狂计划都久经考验 靠自己。安全漏洞,不像功能漏洞 您的应用程序,运行深度和无声。它们可以休眠多年。
~Jeff Atwood,Stack Exchange 和 Discourse 联合创始人
【讨论】:
我很欣赏你的观点。我确实没有尝试发明自己的密码散列方案。我的应用程序基本上使用 AES 系统使用密码加密文件。每个文件的密码使用 BCrypt 进行哈希处理并存储在文件中。第二级安全性是应用程序本身的密码。我需要以安全的方式存储它。 正如大家所建议的,将其存储在数据库中! here for SQL 但问题是我不知道如何创建无法删除的数据库。到目前为止,我已经想出了以下代码: 字符串驱动 = "org.apache.derby.jdbc.EmbeddedDriver";字符串 dbName = "数据库";字符串 connectionURL = "jdbc:derby:" + dbName + ";create=true"; Class.forName(驱动程序);连接连接 = DriverManager.getConnection(connectionURL); String createString = createString = "CREATE TABLE PasswordTable (PASSWORD VARCHAR(100) NOT NULL)"; stmt = conn.createStatement(); stmt.executeUpdate(createString); PreparedStatement psInsert = conn.prepareStatement("INSERT INTO PasswordTable VALUES (?)"); psInsert.setString(1, 密码); psInsert.executeUpdate();以上是关于通过 Java 在 Windows 中存储密码的位置的主要内容,如果未能解决你的问题,请参考以下文章
JAVA连接LDAP(Windows AD)验证时,密码为空验证通过的问题?