카테고리 없음
CryptoUtils
청춘고양이
2022. 8. 14. 20:38
반응형
1. 비밀번호를 설정할 때 필요한 단방향 암호화 메서드 만들기. 나중에 전역적으로 사용할 수 있기 때문에 utils라는 패키지 생성 -> CryptoUtils라는 클래스 생성
2. CrytoUtils 생성자를 private를 걸어서 접근을 제한함. 잘못된 값이 실수로 들어오는 경우를 막기.
3. 단방향 암호화의 종류는 여러 개가 있으므로 우선 enum으로 만들어 주기.
4. 해싱 과정을 처리할 메서드 만들기.
5. 각각의 경우에 대한 메서드 오버로딩.
public class CryptoUtils {
public enum Hash {
MD5("MD5"),
SHA_256("SHA-256"),
SHA_512("SHA-512");
public final String algorithm;
Hash(String algorithm) {
this.algorithm = algorithm;
}
}
public static String hash(Hash hash, String input) {
return CryptoUtils.hash(hash, input, StandardCharsets.UTF_8, null);
}
public static String hash(Hash hash, String input, String fallback) {
return CryptoUtils.hash(hash, input, StandardCharsets.UTF_8, fallback);
}
public static String hash(Hash hash, String input, Charset charset) {
return CryptoUtils.hash(hash, input, charset, null);
}
public static String hash(Hash hash, String input, Charset charset, String fallback) {
try {
return CryptoUtils.hashUnsafe(hash, input, charset);
} catch (NoSuchAlgorithmException ignored) {
return fallback;
}
}
public static String hashUnsafe(Hash hash, String input) throws NoSuchAlgorithmException {
return CryptoUtils.hashUnsafe(hash, input, StandardCharsets.UTF_8);
}
public static String hashUnsafe(Hash hash, String input, Charset charset) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance(hash.algorithm);
messageDigest.reset();
messageDigest.update(input.getBytes(charset));
byte[] hashBytes = messageDigest.digest();
return String.format(String.format("%%0%dx", hashBytes.length), new BigInteger(1, hashBytes));
}
private CryptoUtils() {
}
}
반응형