我想知道我当前的 BCrypt 实现是否正确,我知道我没有使用BCrypt.checkpw()
这可能会导致问题,所以这是我在这里验证它的主要原因。
Hasher.java 容器类:
abstract public class Hasher {
public static String hash(final char[] input) {
String output = Hasher.hash(new String(input));
for (int i = 0; i < input.length; i++) {
input[i] = 0;
}
return output;
}
public static String hash(final String input) {
return BCrypt.hashpw(input, BCrypt.gensalt());
}
}
这里有一个问题:出于安全原因JPasswordField
给我一个,但只接受字符串。我怎样才能避免那个字符串在我的记忆中漂浮?char[]
BCrypt.hashpw()
客户端登录实现:
String hashedPassword = Hasher.hash(password);
Network.getInstance().send("login " + username + " " + hashedPassword);
所以哈希是通过网络发送的,目前网络没有加密,但我计划添加它。
创建帐户的服务器实现:
public static Account createAccount(final String username, final String password) {
String hashedPassword = Hasher.hash(password.toCharArray());
return new Account(username, hashedPassword);
}
检查密码的服务器实现:
public boolean checkPassword(final String hashedPassword) {
return this.hashedPassword.equals(hashedPassword);
}
作为this.hashedPassword
服务器内存中的哈希(来自启动时的数据库)。
我的设置的属性:
- 登录需要客户端大量时间,因为那里的密码是散列的。
- 创建帐户/更改密码需要服务器大量时间,因为密码随后在服务器上进行哈希处理。
- 验证登录尝试几乎不需要服务器花费时间,因为不需要进行散列。
- 如果有人掌握了包含哈希的数据库,那么他将花费大量时间来破解每个帐户的密码。
- 我仍然需要为
BCrypt.gensalt()
.
请验证我的假设。
问候。