这是在 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 进行身份验证。
我正在从 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 进行身份验证。