Java .class
文件可以很容易地被反编译。如果我必须在代码中使用登录数据,那么该如何保护我的数据库?
Java .class
文件可以很容易地被反编译。如果我必须在代码中使用登录数据,那么该如何保护我的数据库?
不要在代码中硬编码密码。这个问题最近在“最危险的25个编程错误”中被提出:
将秘密账户和密码硬编码进你的软件非常方便,但对于技术娴熟的逆向工程师来说却不是问题。如果密码在所有软件中都相同,当密码被知道后,每一个客户端都会变得不安全。并且因为它是硬编码的,修复起来非常麻烦。
你应该将配置信息(包括密码)存储在一个单独的文件中,在应用程序启动时读取该文件。这是防止密码由于反编译而泄漏的唯一真正方法(根本就不要将其编译进二进制文件中)。
了解更多关于这个常见错误的信息,你可以阅读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
方法。当需要连接到数据库时,只需使用getUsername
和getPassword
方法检索存储的值即可。登录凭据不会硬编码到二进制文件中,因此反编译不会造成安全风险。Preferences.userNodeForPackage
将在当前用户的主目录中创建XML文件,其他用户无法读取该目录。在Windows中,情况可能不同。Preference
类将以纯文本形式存储用户名和密码,但首选项文件只能被授权用户读取。用户只需打开偏好设置XML文件并阅读登录凭据即可,但这不会构成安全风险,因为用户从一开始就知道凭据。将密码放入应用程序将读取的文件中。绝不要将密码嵌入源文件中。
Ruby有一个鲜为人知的模块叫做DBI::DBRC,用于这种用途。我毫不怀疑Java有相应的模块。无论如何,编写一个类似的模块并不难。
hash("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hbllo") = 58756879c05c68dfac9866712fad6a93f8146f337a69afe7dd238f3364946366
显然,您不是Google或银行,因此这对您来说是一种过度解决方案。但接下来的问题是:您的项目需要多少安全性,您有多少时间和金钱?
对于许多应用程序,虽然不建议,但将硬编码密码存储在代码中可能是足够好的解决方案。但是,通过从上述列表中轻松添加几个额外的安全步骤,您可以使应用程序更加安全。
例如,假设步骤1对于您的项目不是可接受的解决方案。您不希望用户每次都输入密码,或者您甚至不想/不需要让用户知道密码。但仍然有敏感信息存在,您希望保护这些信息。您有一个简单的应用程序,没有服务器来存储您的文件,或者这对于您的项目来说太麻烦了。您的应用程序在无法安全存储文件的环境中运行。这是最糟糕的情况之一,但是通过一些额外的安全措施,您可以拥有更安全的解决方案。例如,您可以将敏感信息存储在文件中,并对文件进行加密。您可以在代码中硬编码加密私钥。您可以混淆代码,使其更难以破解。有许多库可用于此目的,请参见this link。(我要再次警告您,这并不是100%安全的。聪明的黑客使用正确的知识和工具可以破解它。但根据您的要求和需求,这可能是足够好的解决方案)。MD5是一种哈希算法,而不是加密算法。简而言之,您无法恢复哈希的内容,只能进行比较。 最好在存储用户认证信息时使用它,而不是数据库用户名和密码。 应该将数据库用户名和密码加密并保存在配置文件中,以尽可能减少风险。