可以非常轻松地对Java .class
文件进行反编译。如果我必须在代码中使用登录数据,我该如何保护我的数据库?
答案 0 :(得分:112)
答案 1 :(得分:15)
将密码放入应用程序将读取的文件中。切勿在源文件中嵌入密码。周期。
Ruby有一个名为DBI::DBRC的鲜为人知的模块用于此类用法。我毫不怀疑Java有一个等价物。无论如何,写一个并不难。
答案 2 :(得分:3)
您在撰写网络应用程序吗?如果是这样,请使用JNDI在应用程序外部配置它。概述可用here:
JNDI提供统一的方式 应用程序来查找和访问远程 通过网络提供的服务。遥控器 服务可以是任何企业服务, 包括消息服务或 特定于应用程序的服务,但是 当然,JDBC应用程序是 主要对数据库感兴趣 服务。一旦DataSource对象是 使用JNDI创建并注册 命名服务,应用程序可以使用 用于访问该DataSource的JNDI API 对象,然后可以用于 连接到它的数据源 表示。
答案 3 :(得分:2)
无论您做什么,敏感信息都会存储在某个文件中。你的目标是让它尽可能难以获得。您可以实现多少取决于您的项目,需求和公司钱包的厚度。
最好的方法是不在任何地方存储任何密码。这是通过使用哈希函数生成和存储密码哈希来实现的:
hash("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hbllo") = 58756879c05c68dfac9866712fad6a93f8146f337a69afe7dd238f3364946366
散列算法是单向函数。他们转动任何数量的数据 进入固定长度的“指纹”,无法逆转。他们也 如果输入改变了甚至一点点,那就具有这样的特性 结果哈希是完全不同的(参见上面的例子)。这个 非常适合保护密码,因为我们想存储密码 以一种保护它们的形式,即使密码文件本身也是如此 妥协,但与此同时,我们需要能够验证一个 用户的密码是正确的。
无关的说明: 在互联网时代,当您点击“忘记密码”链接时,网站会通过电子邮件向您发送明文密码。他们可能将它们存储在某个数据库中。当黑客获得对其数据库的访问权限时,他们将获得对所有密码的访问权限。由于许多用户会在多个网站中使用相同的密码,因此这是一个巨大的安全问题。幸运的是,现在这不是常见的做法。
现在出现的问题是:存储密码的最佳方法是什么?我认为this (authentication and user management service stormpath's)解决方案是一个非常理想的解决方案:
显然,你不是谷歌或银行,所以这对你来说是一个矫枉过正的解决方案。但接下来的问题是:您的项目需要多少安全性,您有多少时间和金钱?
对于许多应用程序,虽然不推荐,但在代码中存储硬编码密码可能是一个很好的解决方案。但是,通过从上面的列表中轻松添加几个额外的安全步骤,您可以使您的应用程序更加安全。
例如,假设步骤1不是您项目的可接受解决方案。您不希望用户每次都输入密码,或者您甚至不希望/需要用户知道密码。你仍然有某些敏感信息,你想保护它。您有一个简单的应用程序,没有服务器来存储您的文件,或者这对您的项目来说太麻烦了。您的应用程序在无法安全存储文件的环境中运行。这是最糟糕的情况之一,但仍然有一些额外的安全措施,您可以有更安全的解决方案。例如,您可以将敏感信息存储在文件中,并且可以加密该文件。您可以在代码中对加密私钥进行硬编码。您可以对代码进行模糊处理,因此您可能会让某些人破解它。为此目的存在许多库,请参阅this link。 (我想再次警告你,这不是100%安全。拥有正确知识和工具的聪明黑客可能会破解这一点。但根据您的要求和需求,这对您来说可能是一个很好的解决方案。)
答案 4 :(得分:1)
此问题说明如何将密码和其他数据存储在加密文件中:Java 256-bit AES Password-Based Encryption
答案 5 :(得分:0)
MD5是一种哈希算法,而不是加密算法,简而言之,你不能回过头来看,你只能比较。 理想情况下,应该在存储用户身份验证信息时使用它,而不是db用户名和密码。 db username和pwd应该加密并保存在配置文件中,以便做到最少。