1

我创建了一个使用 jdbc 与 sql 数据库连接的 java 应用程序。它是一个摇摆应用程序。连接数据库的代码在项目的其中一个文件中。sql server 的用户名和密码在那里被硬编码。

我想要一个解决方案,以便我连接到服务器(网络上具有数据库的计算机之一)而不直接在应用程序中写入密码,而是应该从服务器上的某个文件中读取。怎么做?

同样,这里出现了一个安全问题,我必须在应用程序中提供文件名。由于 jar 文件可以很容易地被反编译以获得源代码,因此任何人都可以看到文件名并访问它。

如何解决这个安全问题?

4

3 回答 3

2

我理解你的担忧,但没有办法完全达到你想要的。如果应用程序必须与数据库连接,它必须“知道”访问凭据。

“混淆”技术(如“加密密码并即时解密”或“从其他地方提取密码”)只是将问题转移到其他地方的缓解措施。

您应该考虑添加一个抽象层。您的应用程序应该访问仅提供应用程序所需的 CRUD 功能的远程 Web 服务,并应用最小权限原则。现代客户端-服务器架构的设计方式是“富客户端”(如您的 Swing 应用程序)不直接与 DBMS 交互。是的,它速度较慢,但​​更安全且可扩展。此外,您的富客户端变得“不那么丰富”(它不实现业务逻辑),因此例如,如果您更改表,则无需更新它。

使用 Web 服务还使您能够实施复杂的约束。例如,以在线帮助台为例。一个常见的规则是您不能在已关闭的工单上发布消息。你如何在 DBMS 中执行它?如果我可以登录到您的 DBMS,我可以为closed属性设置为的票发布尽可能多的消息1:除非某些 DBMS 甚至不支持某些繁琐的 CHECK 子句,否则没有任何东西会强制执行约束。

隐藏你的数据库!

将 REST 视为用于 Web 服务的 SOAP 的轻量级替代方案。在 Java 中,您可以使用Jersey快速创建 REST 服务器和客户端。

于 2013-01-06T11:52:22.763 回答
1

问题是凭证不应该在代码中硬编码。这也适用于 Web 服务凭据。

我建议向用户询问用户名密码,一次(第一次启动)或者甚至定期(比如每月)。然后您可以将凭据保存在用户主目录中,设置权限以便只有所有者可以访问它们(让操作系统关心安全性)。大多数需要身份验证的 Web 服务器或多或少都遵循这些原则。

于 2013-01-06T12:01:00.293 回答
0

你说

我想要一个解决方案,以便我连接到服务器(网络上具有数据库的计算机之一)而不直接在应用程序中写入密码,而是应该从服务器上的某个文件中读取

希望您不是将服务器作为数据库服务器,因为首先要从数据库服务器访问密码,您需要在服务器端(部署应用程序的地方)访问您需要密码的数据库服务器:)。理想情况下,您应该提供凭据在部署应用程序的属性文件中。这是它通常的做法

关于安全性,我能想到的一种方法是您可以编写将在属性文件中生成凭据的程序,并邮寄给 db admin 以在某个时间点更改凭据。

于 2013-01-06T12:12:32.247 回答