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

如何保护基于客户端服务器的Java桌面应用程序的数据库凭据,java,security,passwords,desktop-application,Java,Security,Passwords,Desktop Application,好的,在我开始之前,我知道很多人已经问过这个问题。但是我真的没有找到我想要的解决办法。所以我在这里,解释我的项目和要求,并提出同样的问题 我正在做一个关于远程电子投票系统的最后一年项目。 使用java开发客户端应用程序,允许公众用户使用选举委员会提供给每个投票人的LOGINID和LoginPass登录应用程序。 然后,客户端应用程序显示参与选举的候选人列表,并有单选按钮选择其中一个。选择后,用户可以按“投票”按钮进行投票 现在的问题是,要投票,我需要将此信息发送到服务器上的数据库。如何从客户端应

好的,在我开始之前,我知道很多人已经问过这个问题。但是我真的没有找到我想要的解决办法。所以我在这里,解释我的项目和要求,并提出同样的问题

我正在做一个关于远程电子投票系统的最后一年项目。 使用java开发客户端应用程序,允许公众用户使用选举委员会提供给每个投票人的LOGINID和LoginPass登录应用程序。 然后,客户端应用程序显示参与选举的候选人列表,并有单选按钮选择其中一个。选择后,用户可以按“投票”按钮进行投票

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

我不能真正使用属性文件或配置文件&使用操作系统功能保护它,因为最终用户也可以读取这些文件,因为他们是操作系统的管理员/所有者

哦,是的,我将以JAR文件的形式分发客户端应用程序,因此,无论我是将其硬编码到源代码中,还是对其进行加密,还是使用属性文件,所有这些都存在风险&为了了解数据库的详细信息,需要进行反编译

这有替代品吗? 有解决办法吗? 如果有,请提供详细信息或如何实施


谢谢。

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


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

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


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

决不允许用户直接远程写入数据库

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


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

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

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


如果你不知道怎么做,说真的,你不应该写一个投票应用程序。

我认为解决这两件事的方法是一样的。您已经在以某种方式询问服务器该投票者的用户名和密码是否正确

让它成为数据库前面的Web服务,只需两个调用都经过loginuser和loginpass的身份验证

获取/user/\u self

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

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

职位/糖果/候选人

这将注册登录用户的投票

如果您将其置于SSL之上,并同时使用客户端和服务器证书验证,那么您很有可能不会欺骗客户端向无效客户端发送登录详细信息,并且服务器不会从任何旧客户端收到无效请求

如果您将其作为需要签名jar文件的web start应用程序,并在客户端上进行一些密钥安装,那么您将拥有一个合理的安全路径

您可以将DB放在防火墙区域,而web应用程序放在DMZ中。从web应用程序到数据库的访问可以使用正常的方法完成,但是对于某种程度上安全的应用程序,您将尽最大努力确保如果DMZ框被破坏,您仍然无法投下有效的一票

请注意:

客户端应用程序中的任何位置都没有密码 客户端和服务器相互验证用户公钥 用户的密码是在假定基本身份验证的情况下通过网络发送的,但此网络是SSL网络。 您可以通过SSL使用摘要身份验证,这意味着用户的密码永远不会通过网络发送。
我认为解决这两件事的办法是一样的。您已经在以某种方式询问服务器该投票者的用户名和密码是否正确

让它成为数据库前面的Web服务,只需两个调用都经过loginuser和loginpass的身份验证

获取/user/\u self

这会回来的 一些关于用户的信息,以便您可以适当地问候他们,并允许您检查他们是否知道自己的密码

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

职位/糖果/候选人

这将注册登录用户的投票

如果您将其置于SSL之上,并同时使用客户端和服务器证书验证,那么您很有可能不会欺骗客户端向无效客户端发送登录详细信息,并且服务器不会从任何旧客户端收到无效请求

如果您将其作为需要签名jar文件的web start应用程序,并在客户端上进行一些密钥安装,那么您将拥有一个合理的安全路径

您可以将DB放在防火墙区域,而web应用程序放在DMZ中。从web应用程序到数据库的访问可以使用正常的方法完成,但是对于某种程度上安全的应用程序,您将尽最大努力确保如果DMZ框被破坏,您仍然无法投下有效的一票

请注意:

客户端应用程序中的任何位置都没有密码 客户端和服务器相互验证用户公钥 用户的密码是在假定基本身份验证的情况下通过网络发送的,但此网络是SSL网络。 您可以通过SSL使用摘要身份验证,这意味着用户的密码永远不会通过网络发送。
请注意,在客户端运行的这个程序无论以何种方式实现,从根本上讲都是不安全的

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

请记住,您嵌入到程序中的任何密钥都可以由完全访问该程序的人恢复,您所能做的最好的事情是使恢复耗时。。查看stackexchange上的此问题以了解原因

这就是为什么DRM在所有计算历史中总是被击败的主要原因

现在,如果您想实现一个更现实的投票系统,您可能会将其实现为一个web应用程序JavaEE,例如,用户将使用浏览器进行投票。 这样既更加安全,也不需要选民在电脑上安装任何程序


然后是投票者身份和投票者强制的问题,但我认为这一点大家都很清楚。

请注意,在客户端运行的该程序无论以何种方式实现,都将从根本上不安全

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

请记住,您嵌入到程序中的任何密钥都可以由完全访问该程序的人恢复,您所能做的最好的事情是使恢复耗时。。查看stackexchange上的此问题以了解原因

这就是为什么DRM在所有计算历史中总是被击败的主要原因

现在,如果您想实现一个更现实的投票系统,您可能会将其实现为一个web应用程序JavaEE,例如,用户将使用浏览器进行投票。 这样既更加安全,也不需要选民在电脑上安装任何程序


还有选民身份和选民被胁迫的问题,但我认为这一点大家都很清楚。

请注意,无论是电子投票还是纸质投票,从根本上讲都是有危害的,因为你无法确定选民是否被胁迫。是的,我确实意识到了这一点。这只是我的项目工作,我并不打算要求政府或任何组织使用它,至少不是这样一个可以强迫选民的组织。不过还是要感谢:请注意,无论是电子投票还是纸质投票,从根本上讲都会受到损害,因为你无法确定投票人是否被胁迫。是的,我确实意识到了这一点。这只是我的项目工作,我并不打算要求政府或任何组织使用它,至少不是这样一个可以强迫选民的组织。不过还是谢谢你:请注意,这对于家庭作业来说是可以的。真正的投票要难得多!请注意,这对于家庭作业来说是可以的。真正的投票要难得多!谢谢你的回复。是的,我想这是唯一的办法。有什么建议可以让我继续下去吗?从客户端到服务器的SSL套接字连接,然后从客户端和服务器向n fro传递信息?我应该这样做吗?另外,我擅长java,但这是我第一个基于客户端-服务器的应用程序,需要一些安全性和东西。谢谢你的回复。是的,我想这是唯一的办法。有什么建议可以让我继续下去吗?从客户端到服务器的SSL套接字连接,然后从客户端和服务器向n fro传递信息?那是我该走的路吗 出去?另外,我擅长java,但这是我第一个基于客户机-服务器的应用程序,需要一些安全性和东西。