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

时间:2012-12-10 13:08:41

标签: java mysql security

好的,我提前为这个问题道歉,因为它很广泛。

基本上,我正在开发一个涉及的系统:

  1. 用户可以注册帐户的网站。此过程将在该帐户的服务器上创建一个新数据库。
  2. 用Java编写的客户端外部应用程序。这将访问数据库中的数据,以便为用户执行有用的操作。
  3. 在第一点创建的数据库本身。
  4. 我的问题是应该采取哪些安全措施来保证数据库的安全以及如何安全地传输数据。

    我担心的是:

    1. 如何真正保护MySQL数据库?当我在帐户注册时创建数据库时,是否需要为该数据库设置密码?这会加密数据库吗?这足以阻止某人访问数据吗?
    2. Java很容易反编译。假设我要在master数据库中存储帐户数据库的数据,如何保护该数据库并从我的应用程序连接到该数据库,这种方式不需要我硬编码连接到该数据库的详细信息在申请中。我认为这也是编译为本机代码的语言中的一个问题,因为有人可能只是执行内存转储以在应用程序的运行时获取此类变量(我认为)。
    3. 当从服务器向客户端发送和接收数据(反之亦然)时,如何防止某人进行网络窃听和获取数据(无论是登录凭据还是数据库中的其他数据)。我认为这是SSL的用途,但是我需要使用它吗?
    4. 这些问题的一个可能答案是在Java客户端应用程序和数据库之间使用中间人服务,就像在Javascript和MySQL数据库之间使用PHP一样(尽管PHP是必需的)这个案例)。我假设这个中间人服务将包含主数据库等的登录凭据,并将包含自己的方法来防止未经授权的访问。如果这是正确的,我将如何设置这样的服务?是否可以利用Java应用程序中的PHP脚本来传输数据?

      我希望我的问题有道理并且不会太模糊。 提前感谢您的时间。

3 个答案:

答案 0 :(得分:4)

  

如何真正保护MySQL数据库?当我在帐户注册时创建数据库时,是否需要为该数据库设置密码?这会加密数据库吗?这足以阻止某人访问数据吗?

  1. 使用帐户名和密码,以及“授予”不同用户的特定数据库的不同访问权限。

  2. 密码与用户帐户相关联,而不是数据库。

  3. MySQL数据库未加密。

  4. 是的......虽然如果不受信任的人可以获得数据库本身或托管数据库的系统的管理控制权,那么所有投注都将被取消。

  5.   

    Java很容易反编译。假设我要在master数据库中存储帐户数据库的数据,如何保护该数据库并从我的应用程序连接到该数据库,这种方式不需要我硬编码连接到该数据库的详细信息在申请中。

    一种常见的方法是将连接详细信息和/或帐户凭据放入应用程序在启动时加载的属性文件中。但是,我认为您真正的问题是您希望允许在不受信任的计算机上运行的应用程序对数据库进行更新。更合理的解决方案是在适当安全的计算机上运行受信任的服务,让不受信任的计算机与受信任的服务进行通信,而不是直接与数据库通信。

      

    我认为这也是编译为本机代码的语言中的一个问题,因为有人可能只是执行内存转储以在应用程序的运行时获取此类变量(我认为)。

    这是正确的。

      

    当从服务器向客户端发送和接收数据(反之亦然)时,如何防止某人进行网络窃听并获取数据(无论是登录凭据还是数据库中的其他数据)。我认为这就是SSL的用途,但是我需要使用它吗?

    SSL足以保护通过网络发送的数据(或凭据)。

    中间人攻击的情况很不明确,当然涉及到网络浏览器以及是否应该真正信任受信任的根。但是,如果我理解我正确阅读的内容,有一种方法可以使用对MITM免疫的SSL。基本上,您需要为所有参与者(客户端,服务器)生成单独的SSL证书,并使用带外分发机制将它们分发给所有参与者;即不通过互联网。然后,您只接受来自具有已知证书的各方的SSL连接。并确保使用TLS 1.1或1.2。

答案 1 :(得分:2)

您认为您的客户端应用程序永远不应存储数据库身份验证信息是正确的。反编译Java应用程序以检索这些连接字符串太容易了。

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

答案 2 :(得分:2)

我看到了一些可能性 -

  1. 使用jBoss SX框架
  2. 使用EJB是另一回事,它提供了所需的抽象层。
  3. JCA组件可用于中间人组件
  4. 最后,还可以通过一些可用的工具(如sqlMAP)访问SQL注入。