1

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

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

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

4

5 回答 5

2

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

这是一个解释如何 生成 MD5 哈希的答案?

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

于 2012-10-20T11:54:34.863 回答
1

根据您需要用户密码的安全程度,您可能还需要使用加密盐和拉伸。

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

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

加盐意味着如果您的一个用户的密码被破解,那么具有相同密码的其他用户将在数据库中具有不同的哈希值,从而防止攻击者立即知道他们的密码。盐的长度可以为 16 个字节,以获得良好的安全性。

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

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

调整数字5000以获得您想要的延迟。

于 2012-10-20T12:45:25.510 回答
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

于 2012-10-20T13:08:33.297 回答
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 不是问题。2000 的迭代计数应该是最小值,如果您的应用程序可以处理 CPU 要求,请使用更高的值。

于 2012-10-22T22:31:25.930 回答
-1

存储散列而不是密码(无论是明文还是加密)的主要思想是散列是不可逆的——任何人都可以访问数据库和/或加密密钥,但仍然不知道密码。这不仅仅是关于混淆/加密。哈希用于释放允许恢复密码的信息,并使其无法以任何方式识别密码。哈希是您希望使用的任何函数,它可以保证所需程度的唯一性和不可逆性 - java 哈希码很容易复制,MD5 和 SHA1 有已知的弱点。现在推荐的是例如 SHA-256。

于 2012-10-20T12:47:34.980 回答