콘텐츠로 이동

2023 06 15

2023-06-15

MessageDigest

참고: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/security/MessageDigest.html 참고: https://m.blog.naver.com/puri8467/221429417229 참고: https://kshman94.tistory.com/84

  • 개요
    • 단방향 해시 함수값을 구할 때 사용
      • 비밀번호를 해시화하여 저장하고 싶은 경우
      • 파일의 유효성을 해시 값을 통해 확인하고 싶은 경우
      • 특정 정보를 암호화하고 싶은 경우
    • Java에서 MD5, SHA를 이용한 알고리즘 사용하려면 MessageDigest 클래스를 사용하자
    • 랜덤 길이의 데이터 사이즈를 고정된 해시값으로 변경 시켜줄 때 사용
      • 데이터는 update 메서드를 통해 프로세싱이 된다
      • reset을 통해 원복 시킬 수 있다
      • update가 완료되면, digest 메서드가 수행되어 hash 계산을 완수한다
      • digest가 실행되면, MessageDigest는 초기화 상태로 돌아간다
  • 메서드
    • getInstance(String algorithm)
      • 입력한 해시 알고리즘 수행하는 MessageDigest 생성
    • update(byte[] input)
      • digest를 업데이트 시킴
    • digest(): byte[]
      • Hash 연산을 완료하고 패딩 붙이기 등의 최종연산 수행
  • 예제 코드
    public class sha256 {
        public static String hashSha256(String pwd) {
            try {
                MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
                byte[] hash = messageDigest.digest(pwd.getBytes("UTF-8"));
                StringBuffer hexString = new StringBuffer();
                for (int i = 0; i < hash.length; i++) {
                    String hex = Integer.toHexString(0xff & hash[i]);
                    if (hex.length() == 1) hexString.append('0');
                    hexString.append(hex);
                }
                return hexString.toString();
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }
        }
    }
    

Hash Function & Hash Table

  • Hash Function
    • Input을 받아 고정된 길이의 문자열로 처리
      • 고정된 길이의 문자열을 hash-cdoe/hash-value 라고 지칭
    • 랜덤한 길이의 Input을 무엇을 받던 고정된 길이의 문자열로 변경시켜주는게 해시 함수의 용도
    • 해시 함수의 결과값은 주로 해시테이블과 같은 데이터 구조의 인덱스/주소값으로 사용된다
  • Hash Table
    • Hash Function으로 고정된 길이의 문자열 반환 받았자나?
    • 그거 적당한 버켓에 넣어주세요
    • 자바의 hashMap은 hashCode()를 통해서 해싱을 진행하는데, 이는 기본적으로는 메모리 주소로 결정된다
      • 커스텀 가능하긴 함 (SHA-256 같은걸로다가)