我在Java中使用给定密码创建哈希并将其存储到MySQL数据库中。我已经阅读了很多关于在数据库中存储盐的信息,但有几个原因我选择不在这里。似乎无法从 Hacker 中完全隐藏特定于每个用户的随机盐,并且没有办法隐藏我有托管数据库和可下载软件。由于该软件仅在内部使用,因此最多有20个用户, Hacker 更容易发现数据库端口,而不是软件。至少通过在软件中生成salt而不是将其存储在数据库中,他需要找到要反编译的软件并确定salt / hash方法。
这是我使用的方法:
public static byte[] getHash(String password) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] passBytes = password.getBytes();
byte[] salt = digest.digest(passBytes);
byte[] digestable = new byte[passBytes.length + salt.length];
System.arraycopy(passBytes, 0, digestable, 0, passBytes.length);
System.arraycopy(salt, 0, digestable, passBytes.length, salt.length);
return digest.digest(digestable);
}
编辑: Precident for putting this here
我看到我需要生成一个随机盐,我现在可以存储它。
答案 0 :(得分:1)
不,唯一可接受的密码哈希方法是bcrypt,scrypt和PBKDF2。
SHA-256太快了。你想要一个缓慢的哈希方法,如上所述。
如果您的主要安全威胁是SQL注入,那么您应该密码密码。这意味着使用Web服务器已知的密码对密码进行HMAC,而不是数据库服务器。请参阅https://blog.mozilla.org/webdev/2012/06/08/lets-talk-about-password-storage。
您还应该拒绝用户/密码表访问您的Web服务器,并拥有一个非常简单的存储过程api进行身份验证。