如何保护MySQL数据库免受未经授权的访问并从Java应用程序安全连接到它

3

很抱歉,这个问题可能比较广泛。下面是我的理解:

我正在开发一个系统,包括以下内容:

  1. 一个网站,用户可以注册账户。这个过程会在服务器上为该账户创建一个新的数据库。
  2. 一个用Java编写的客户端应用程序。它将访问数据库中的数据,以执行有用的操作。
  3. 第一点中创建的数据库本身。

我的问题是关于哪些安全措施应该实施,以使数据库安全,并如何安全地传输数据。

我的担忧是:

  1. MySQL数据库实际上是如何保护的?当我在账户注册时创建数据库时,需要为该数据库设置密码吗?这样加密了数据库吗?这足以防止其他人访问数据吗?
  2. Java相当容易反编译。假设我要在主数据库中存储某个账户数据库的登录数据,如何保护该数据库并以一种不需要在应用程序中硬编码连接详细信息的方式连接到该数据库?我认为这也必须是编译成本机代码的语言中的问题,因为某些人只需执行内存转储即可在应用程序运行时获得这些变量(我想)。
  3. 在从客户端到服务器和反之间发送和接收数据时,如何防止网络窃听者获取数据(无论是登录凭据还是来自数据库的其他数据)。我想这就是SSL的作用,但这是否足够?

对这些问题的一个可能答案是在Java客户端应用程序和数据库之间使用中间人服务,就像在JavaScript和MySQL数据库之间使用PHP一样(虽然在这种情况下,PHP是必需的)。我认为这个中间人服务将包含主数据库的登录凭据等信息,并且将包含其自己的方法以防止未经授权的访问。如果这是正确的,那么我该如何设置这样的服务?是否可能从Java应用程序中利用PHP脚本传输数据?

感谢您花时间阅读我的问题。


2
我认为这个问题太过宽泛,无法回答。其中一些部分已经在SO上反复提问和回答,而其他部分则需要更多关于上下文的信息才能回答,例如您的客户是否可以信任他们自己的数据库等等... - thkala
抱歉表述过于笼统和模糊。客户可以信任他们的数据库,因为其中的信息将由他们输入和管理。我最初考虑使用客户端数据库,但认为如果用户下载了Java客户端应用程序并且可以访问互联网,则允许从任何地方访问数据会更好。多个用户将访问同一个数据库(基本上是业务中由企业拥有但由多个经理访问的帐户)。[续上] - Ben Guest
这将减少数据中的冗余级别,因为只有一个数据库被多个位置访问。希望这样能稍微清楚一些。 - Ben Guest
3个回答

4
MySQL数据库的安全问题是如何解决的?当我在账户注册时创建数据库,我需要为该数据库设置密码吗?这是否会加密数据库?这样足以防止他人访问数据吗?
使用帐户名和密码,再加上针对特定数据库授予不同用户的不同访问权限。
密码与用户帐户相关联,而非与数据库相关联。
MySQL数据库没有加密保护。
是的...但如果不受信任的人可以获得数据库本身或托管数据库的系统的管理员控制,则所有赌注都无效。
Java代码很容易反编译。假设我要将帐户数据库中的登录数据存储在主数据库中,如何保护该数据库,并以不需要在应用程序中硬编码连接详细信息的方式连接到它?
通常的方法是将连接详细信息和/或帐户凭据放入属性文件中,在应用程序启动时加载该文件。但是,我认为您真正的问题是想允许在不受信任的计算机上运行的应用程序更新数据库。更明智的解决方案是在经过适当保护的计算机上运行可信服务,并让不受信任的计算机与可信服务进行通信,而不是直接与数据库进行通信。
我认为这也是编译成本地代码的语言中的问题,因为有人可以执行内存转储来获得应用程序运行时这样的变量。
当向客户端发送和接收数据以及从服务器发送和接收数据时,如何防止网络窃听者获取数据(无论是登录凭据还是其他数据库中的数据)。我认为SSL就是为此而设计的,但这就是我需要使用的全部吗?
SSL足以保护通过网络发送的数据(或证书)。
关于人中攻击的情况还存在不确定性,尤其是在涉及到Web浏览器时,以及可信根是否真的应该被信任。但是如果我正确理解我所读到的内容,有一种使用SSL的方法应该对MITM免疫。基本上,您需要为所有参与者(客户机、服务器)生成单个SSL证书,并使用带外分发机制将其分发给所有参与者;即不通过互联网分发。然后你只接受带有已知证书的参与者的SSL连接。并确保使用TLS 1.1或1.2。

2

我看到了一些可能性 -

  1. 使用jBoss SX框架
  2. 使用EJB是另一种提供所需抽象层的方式。
  3. JCA组件可以用于中间件组件。

最后,SQL注入也可以通过一些可用工具如sqlMAP进行访问。


1

您的判断是正确的,客户端应用程序不应存储数据库认证信息。因为很容易反编译Java应用程序来检索这些连接字符串。

相反,正如我所认为您已经理解的那样,您应该公开提供一个 Web 服务来提供应用程序所需的信息。有几种方法可以实现这一点。例如,您可以编写一个 REST 接口,以便您的客户端向服务器发出 HTTP 调用并收到 JSON 或 XML 响应。您还可以编写一个 Java RMI 服务器,允许客户端在服务器上进行远程方法调用以查找他们需要的信息。如果没有更具体的问题或限制,我无法建议哪种方法更适合。


谢谢您的回复。我会研究一下REST和Java RMI服务器。远程方法调用听起来也有助于解决人们反编译.jar并获取用于数据处理的算法的问题。 - Ben Guest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接