如何为基于客户端 - 服务器的Java桌面应用程序保护数据库凭据

时间:2012-02-19 22:26:17

标签: java security passwords desktop-application

好的,在我开始之前,我知道很多人已经问过这个问题了。但我真的找不到我想要的解决方案。我在这里,解释我的项目&要求,&问同样的问题。

我正在做远程电子投票系统的最后一年项目。 使用LOGINID&amp ;;开发客户端应用程序使用java ,允许公共用户登录到APPLICATION 。 LOGINPASS(由选举委员会给予每个和每个选民左右)。 然后,客户端应用程序显示参与选举的候选人名单,&有单选按钮可以选择其中一个。选择之后,用户可以按“CAST VOTE”按钮以“投票”。

现在的问题是,为了“投票”,我需要将此信息发送到服务器上的数据库。如何从客户端应用程序连接到数据库以更新所需的表/详细信息?我将数据库凭据硬编码到源代码中,但最近意识到它非常不安全。

我真的不能使用PROPERTIES文件或CONFIG文件&使用操作系统功能保护它,因为最终用户也可以读取它们(因为它们是操作系统的管理员/所有者)

哦,是的,我将把客户端应用程序分发为JAR文件左右,&因此,无论是将其硬编码到源代码中,加密它还是使用属性文件,所有这些仍然是开放的风险和反编译以了解数据库详细信息。

这是替代品吗? 任何解决方法? 如果有,请您提供有关它的详细信息或如何实施它?

谢谢。

4 个答案:

答案 0 :(得分:3)

使用普通的客户端 - 服务器应用程序,您不能直接从客户端连接到数据库服务器。而是客户端连接到服务器(使用LOGINID和LOGINPASS作为身份验证),然后连接到数据库服务器。

这意味着客户端不存储有关数据库的任何信息,服务器会调解对它的所有访问权。

答案 1 :(得分:2)

我认为这两件事的解决方案是一样的。如果用户名和密码对选民来说是正确的,你已经在问服务器了。

在数据库前面建立一个web服务,只需要两次调用(通过loginuser和loginpass进行身份验证)

GET / user / _self

这将返回有关用户的一些信息,因此您可以适当地问候它们,并允许您检查他们是否知道他们的密码。

您需要确保不允许暴力攻击,也不要拒绝服务。

POST / candiates / candidate

这将从登录用户注册投票。

如果你把它放在SSL上,并使用客户端和服务器证书验证,那么你很可能不会欺骗客户端向无效客户端发送登录详细信息,并且服务器不会无效来自任何老客户的请求。

如果你把它作为一个web启动应用程序(需要签名的jar文件)并在客户端上进行一些密钥安装,那么你将拥有一条相当安全的路径。

您可以将数据库放在防火墙区域,将Web应用程序放在DMZ中。从Web应用程序到数据库的访问可以使用常规方法完成,但对于有点安全的应用程序,您将尽力确保如果DMZ框被泄露,您仍然无法投出有效的投票。

请注意:

  • 客户端应用中的任何位置都没有密码
  • 客户端和服务器验证彼此的用户公钥
  • 用户的密码通过网络发送(假设BASIC身份验证),但这条线路是SSL。
  • 您可以使用DIGEST auth over SSL,这意味着用户的密码永远不会通过网络发送。

答案 2 :(得分:0)

永远不要让用户远程直接写入数据库!!!!!

写一个服务器应用程序(php,servlets?),用户可以登录,这个应用程序可以更新数据库。

如果你不知道如何做到这一点,说真的,你不应该写一个投票应用程序。

答案 3 :(得分:0)

请注意,无论您采用哪种方式在客户端运行该程序都将从根本上说是不安全的。

我知道这只是一项大学项目工作,永远不会是一个真正的投票系统,但你必须深信这一事实。

请记住,“您在程序中嵌入的任何密钥都可以由具有该程序完全访问权限的人员恢复,您可以做的最好的事情就是花费时间。”请参阅stackexchange上的这个问题,了解https://security.stackexchange.com/questions/35235/how-to-effectively-save-database-password-inside-desktop-application

的原因

这是DRM在所有计算历史中一直被打败的主要原因。

现在,如果您想要实现更现实的投票系统,您可能会将其实现为Web应用程序(例如JavaEE),用户可以使用浏览器进行投票。 这将更安全,并且不需要选民在他的计算机上安装任何程序。

然后是选民和选民强制的身份问题,但我认为每个人都清楚。