这是在 Java 中散列密码的安全方法吗

Is this a secure method of hasing a password in Java

我正在从 Java 中的给定密码创建哈希并将其存储到 MySQL 数据库中。我已经阅读了很多关于在数据库中存储盐的内容,但是有几个原因我选择不在这里。似乎没有办法从 Hacker 完全隐藏每个用户特定的随机盐,也没有办法隐藏我有一个托管数据库和可下载的软件。因为这个软件只在家里使用,它最多有 20 个用户,而且 Hacker 比软件更容易偶然发现数据库端口。至少通过在软件中生成盐而不是将其存储在数据库中,他将需要找到要反编译的软件并确定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

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

不,acceptable 密码散列方法只有 bcrypt、scrypt 和 PBKDF2。

SHA-256 太快了。你想要一个像上面那样的慢散列方法。

如果您的主要安全威胁是 SQL 注入,那么您应该输入密码。这意味着使用 Web 服务器而非数据库服务器知道的秘密对密码进行 HMAC 处理。参见 https://blog.mozilla.org/webdev/2012/06/08/lets-talk-about-password-storage

您还应该拒绝 user/password table 访问您的 Web 服务器,并使用非常简单的存储过程 api 进行身份验证。