当前位置: 首页 > 面试题库 >

如何保护MySQL用户名和密码不被反编译?

司寇瑾瑜
2023-03-14
问题内容

Java .class文件可以很容易地反编译。如果必须在代码中使用登录数据,如何保护数据库?


问题答案:

将机密帐户和密码硬编码到软件中非常方便-对于熟练的反向工程师。如果所有软件上的密码都相同,那么当不可避免地知道该密码时,每个客户都会受到攻击。而且由于它是硬编码的,因此修复起来非常痛苦。

你应将配置信息(包括密码)存储在应用程序启动时读取的单独文件中。这是防止密码因反编译而泄漏的唯一真实方法(切勿首先将其编译为二进制文件)。

有关此常见错误的更多信息,你可以阅读CWE-259文章。本文包含更全面的定义,示例以及有关此问题的许多其他信息。

在Java中,最简单的方法之一是使用Preferences类。它旨在存储各种程序设置,其中一些可能包含用户名和密码。

import java.util.prefs.Preferences;

public class DemoApplication {
  Preferences preferences = 
      Preferences.userNodeForPackage(DemoApplication.class);

  public void setCredentials(String username, String password) {
    preferences.put("db_username", username);
    preferences.put("db_password", password);
  }

  public String getUsername() {
    return preferences.get("db_username", null);
  }

  public String getPassword() {
    return preferences.get("db_password", null);
  }

  // your code here
}

在上面的代码中,可以setCredentials在显示询问用户名和密码的对话框后调用该方法。当你需要连接到数据库时,只需使用getUsernamegetPassword方法即可检索存储的值。登录凭据不会被硬编码到你的二进制文件中,因此反编译不会带来安全风险。

重要说明:首选项文件只是纯文本XML文件。确保你采取适当的步骤来防止未经授权的用户查看原始文件(UNIX权限,Windows权限等)。至少在Linux中,这不是问题,因为调用Preferences.userNodeForPackage将在当前用户的主目录中创建XML文件,无论如何其他用户都不可读。在Windows中,情况可能有所不同。

更重要的注意事项:在此答案的注释以及其他内容的讨论中,有很多讨论都针对这种情况使用了正确的体系结构。最初的问题并未真正提及使用该应用程序的上下文,因此我将讨论我能想到的两种情况。第一种情况是使用该程序的人已经知道(并被授权知道)数据库凭据。第二种情况是你(开发人员)试图对使用该程序的人员保密数据库凭据。

第一种情况:用户被授权知道数据库登录凭据

在这种情况下,我上面提到的解决方案将起作用。Java Preference类将以纯文本形式存储用户名和密码,但是首选项文件仅可由授权用户读取。用户可以简单地打开首选项XML文件并读取登录凭证,但这不会带来安全风险,因为用户知道其开头就是凭证。

第二种情况:尝试向用户隐藏登录凭据

这是更复杂的情况:用户不应该知道登录凭据,但仍然需要访问数据库。在这种情况下,运行应用程序的用户可以直接访问数据库,这意味着程序需要提前知道登录凭据。我上面提到的html" target="_blank">解决方案不适用于这种情况。你可以将数据库登录凭据存储在首选项文件中,但是该用户将是所有者,因此该用户将能够读取该文件。实际上,实际上没有很好的方法可以安全地使用此案例。

正确的情况:使用多层体系结构

正确的方法是在数据库服务器和客户端应用程序之间具有中间层,该中间层对单个用户进行身份验证并允许执行一组有限的操作。每个用户都有自己的登录凭据,但没有数据库服务器的登录凭据。凭据将允许访问中间层(业务逻辑层),并且每个用户都不同。

每个用户都有自己的用户名和密码,可以将它们存储在本地的首选项文件中,而不会带来任何安全风险。这称为三层体系结构(这些层是数据库服务器,业务逻辑服务器和客户端应用程序)。它比较复杂,但这实际上是执行这种操作的最安全的方法。

操作的基本顺序是:

  1. 客户端使用用户的个人用户名/密码通过业务逻辑层进行身份验证。用户名和密码对用户而言是已知的,并且与数据库登录凭据无关。
  2. 如果身份验证成功,则客户端向业务逻辑层发出请求,以从数据库中请求某些信息。例如,产品库存。请注意,客户端的请求不是SQL查询。这是一个远程过程调用,例如getInventoryList
  3. 业务逻辑层连接到数据库并检索请求的信息。业务逻辑层负责根据用户的请求形成安全的SQL查询。应该对SQL查询的所有参数进行清理,以防止SQL注入攻击。
  4. 业务逻辑层将清单列表发送回客户端应用程序。
  5. 客户端向用户显示库存清单。
    请注意,在整个过程中,客户端应用程序永远不会直接连接到数据库。业务逻辑层接收来自经过身份验证的用户的请求,处理客户的清单清单请求,然后才执行SQL查询。


 类似资料:
  • 这样,把pdf文件复制给别人就会迫使“复印机”说出他的用户名和密码…… 编辑:密码是打开文件而不是编辑或打印它,我希望用户能够突出显示文本和添加他们自己的注释

  • 问题内容: 我是Java初学者。我正在开发可解密某些数据的应用程序。解密密钥被硬编码到软件中,因此可以通过分析字节码看到。 我知道不能完全防止逆向工程,所以我想做的就是使过程尽可能地艰巨。 我的想法不是直接将密钥放入代码中,而是将其进行某种转换。例如,我可以写- 这样,查看字节码的人无法立即读取它。但是将必须遵循逻辑并对其进行转换,这在字节级别上不会那么容易。 那么你们怎么看?这有用吗?除了十六进

  • 本文向大家介绍使用SNK密钥文件保护你的DLL和代码不被反编译教程,包括了使用SNK密钥文件保护你的DLL和代码不被反编译教程的使用技巧和注意事项,需要的朋友参考一下 大家做项目开发一般都是分层的,比如UI层,业务层,数据访问层。业务层引用数据访问层的DLL(比如dataAccess.dll),并使用dataAccess.dll中的方法。当项目完成并给客户用了,可有些心里BT的客户这个时候也可以请

  • 问题内容: 我正在编写我的第一个使用OAuth的应用程序。这是针对桌面应用程序的,而不是网站或移动设备,在这些应用程序上访问二进制文件会更加困难,因此我关注如何保护应用程序的密钥和机密。我觉得查看编译后的文件并找到存储密钥的字符串很简单。 我是否反应过度,或者这是桌面应用程序的真正问题(使用已知解决方案)? 该项目正在用Java进行编码,但是我也是C#开发人员,因此任何用于.NET的解决方案也将不

  • 我想在Git扩展,Sourcetree或任何其他Git GUI中使用自动推拉,而无需在提示中输入用户名和密码,每次。 那么,如何在Git中保存凭据?

  • 我试图用nodejs和nodemailer发送邮件,但这对我不起作用。我有以下代码: 我得到这个错误: {错误:无效登录:535-5.7.8不接受用户名和密码。了解更多信息,请访问535 5.7.8_actionAUTHCompletep6sm97493129wrx.50-SMTPConnection的gsmtp。SMTPConnection的_formatError(C:\User\Carlos