当他们说需要在数据库中存储密码哈希时会有什么想法?

时间:2012-10-20 11:50:06

标签: java encryption hash hashcode password-encryption

我是网络开发的新手。我使用Java并尝试开发具有注册功能的简单试用应用程序。为了安全起见,我不想明确地在数据库中存储用户密码。

我被告知有必要存储密码哈希。但是,这是什么意思? 什么是哈希?我知道在Java中,每个对象都有一个唯一的哈希码。这是我需要的吗?我需要调用密码的方法hashcode()?也许我只需要应用加密方法?或者首先获取我的密码的哈希码,然后加密它?

我认为安全存储密码有很多选择和方法。但是在这种情况下哈希到底是什么意思?

5 个答案:

答案 0 :(得分:2)

这意味着当用户在注册时输入用户密码时,不会以明文形式存储用户密码,而是使用不可逆的哈希算法(如MD5)对密码进行哈希处理,并将此值保存到数据库中。

这是一个解释如何解决的答案 How can I generate an MD5 hash?

检查密码时,使用相同的算法对登录表单中输入的密码进行哈希,然后将其与保存在数据库中的密码进行比较。

答案 1 :(得分:1)

根据您需要用户密码的安全程度,您可能需要使用cryptographic salt并进行拉伸。

Salt意味着在散列之前向密码添加一些随机字节。这样,如果两个用户选择相同的密码,那么他们将具有不同的哈希值。将salt与哈希一起存储,并在每次需要重新计算哈希值时使用它。

hash <- SHA256(password + salt)  // + is concatenation

Salting意味着如果您的某个用户的密码被破坏,那么具有相同密码的其他用户将在数据库中具有不同的哈希值,因此也可以防止攻击者立即知道他们的密码。为了良好的安全性,盐可以长16个字节。

拉伸意味着重复计算很多次,因此运行大约需要0.1秒。十分之一秒的延迟不会影响您的用户,但意味着任何试图猜测密码的人每秒只能进行十次猜测。

hash <- SHA256(password + salt)
do 5000 times
  hash <- SHA256(hash + salt)
end do

调整数字5000以获得所需的延迟。

答案 2 :(得分:0)

您可能正在寻找SQL的PASSWORD函数。这是存储数据库中加密的任何密码的最简单的解决方案。

你去了:http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html

或者就在这里:http://www.google.com/search?q=sql+function+password+hash

答案 3 :(得分:0)

我建议您查找有关PBKDF2的信息,而不是所有选项。 PBKDF2是用Java实现的。

byte[] salt = new byte[256 / Byte.SIZE];
SecureRandom defaultRNG = new SecureRandom();
defaultRNG.nextBytes(salt);

SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec ks = new PBEKeySpec(password,salt,2000,256);
SecretKey s = f.generateSecret(ks);
final byte[] result = s.getEncoded();

您应该同时存储saltresult。执行相同的计算和二进制比较结果以验证密码。我使用了256位盐和输出大小。在PBKDF2中使用SHA-1不是问题。如果您的应用程序可以处理CPU要求,则迭代次数应为2000,应使用较高的值。

答案 4 :(得分:-1)

存储哈希而不是密码(普通或加密)的主要思想是哈希不可逆转 - 任何人都可以访问数据库和/或加密密钥,但仍然无法识别密码。它不仅仅是关于混淆/加密。哈希用于丢失允许恢复密码的信息,并且无法以任何方式识别密码。散列是你想要使用的任何函数,它保证了所需的唯一性和不可逆性 - java哈希码很容易复制,MD5和SHA1有已知的弱点。现在建议使用例如SHA-256。