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

时间:2009-01-14 13:04:40

标签: java mysql security reverse-engineering decompiling

可以非常轻松地对Java .class文件进行反编译。如果我必须在代码中使用登录数据,我该如何保护我的数据库?

6 个答案:

答案 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. 您的用户输入凭据,并根据此验证 密码哈希
  2. 生成并存储密码哈希,而不是密码
  3. 哈希多次执行
  4. 使用随机生成的盐生成哈希
  5. 使用私钥加密哈希
  6. 私钥存储在与哈希物理上不同的地方
  7. 私钥基于时间更新
  8. 加密的哈希值分为块
  9. 这些块存储在物理上分开的位置
  10. 显然,你不是谷歌或银行,所以这对你来说是一个矫枉过正的解决方案。但接下来的问题是:您的项目需要多少安全性,您有多少时间和金钱?

    对于许多应用程序,虽然不推荐,但在代码中存储硬编码密码可能是一个很好的解决方案。但是,通过从上面的列表中轻松添加几个额外的安全步骤,您可以使您的应用程序更加安全。

    例如,假设步骤1不是您项目的可接受解决方案。您不希望用户每次都输入密码,或者您甚至不希望/需要用户知道密码。你仍然有某些敏感信息,你想保护它。您有一个简单的应用程序,没有服务器来存储您的文件,或者这对您的项目来说太麻烦了。您的应用程序在无法安全存储文件的环境中运行。这是最糟糕的情况之一,但仍然有一些额外的安全措施,您可以有更安全的解决方案。例如,您可以将敏感信息存储在文件中,并且可以加密该文件。您可以在代码中对加密私钥进行硬编码。您可以对代码进行模糊处理,因此您可能会让某些人破解它。为此目的存在许多库,请参阅this link。 (我想再次警告你,这不是100%安全。拥有正确知识和工具的聪明黑客可能会破解这一点。但根据您的要求和需求,这对您来说可能是一个很好的解决方案。)

答案 4 :(得分:1)

此问题说明如何将密码和其他数据存储在加密文件中:Java 256-bit AES Password-Based Encryption

答案 5 :(得分:0)

MD5是一种哈希算法,而不是加密算法,简而言之,你不能回过头来看,你只能比较。 理想情况下,应该在存储用户身份验证信息时使用它,而不是db用户名和密码。 db username和pwd应该加密并保存在配置文件中,以便做到最少。