这是一种在Java中使用密码的安全方法

时间:2015-08-14 18:19:00

标签: java mysql security password-storage

我在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

我看到我需要生成一个随机盐,我现在可以存储它。

1 个答案:

答案 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进行身份验证。