BCrypt의 현재 구현이 올바른지 알고 싶습니다. BCrypt.checkpw()
을 사용하지 않아서 문제가 발생할 수 있으므로 여기에서 확인해야합니다.Java : BCrypt를 잘 사용합니까?
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()
에 대한 좋은 업무 요소를 찾아야합니다.
제 가정을 확인해주십시오.
감사합니다.
제공된 암호를 확인하려면 저장된 암호와 동일한 소금으로 암호 해시해야합니다. – Gumbo
소금은 '해시'안에 저장됩니다 (BCrypt 해시는 실제로 해시 그 이상입니다). 검증 부분을 다루지 않습니까? – skiwi
인증 클라이언트 쪽에서 해싱을 수행하는 것은 일반적으로 좋지 않습니다. 한 가지 방법은 누군가 해시 데이터베이스를 사용하여 암호를 해독하지 않은 경우에도 다른 사람으로 로그인 할 수 있습니다. 또한 소금이 해싱 프로세스 중에 무작위로 생성되므로 로그인해도 동일한 해시가 두 번 생성되지 않으므로 서버 측의 해시와 일치하지 않습니다. – Aurand