MessageDigest

MessageDigest (메시지 다이제스트)

SHA-1, SHA-256 같은 메시지 다이제스트(해시) 알고리즘의 기능을 애플리케이션에 제공하는 클래스입니다. 메시지 다이제스트는 임의 크기의 데이터를 받아 고정 길이 해시 값을 내는 안전한 단방향 해시 함수입니다.

출처: Java API Reference

본문

MessageDigest 객체는 초기화된 상태에서 시작합니다. 데이터는 update 메서드로 처리하고, 모든 데이터를 갱신한 뒤 digest 메서드를 호출해 해시 계산을 완료합니다. digest 호출은 주어진 갱신 횟수에 대해 한 번 수행할 수 있으며, 호출 후 객체는 초기화 상태로 재설정됩니다.

구현은 Cloneable을 자유롭게 구현할 수 있습니다. 클라이언트는 클로닝을 시도하고 CloneNotSupportedException을 잡아 복제 가능 여부를 확인할 수 있습니다.

MessageDigest md = MessageDigest.getInstance("SHA-256");
try {
    md.update(toChapter1);
    MessageDigest tc1 = md.clone();
    byte[] toChapter1Digest = tc1.digest();
    md.update(toChapter2);
    // ...
} catch (CloneNotSupportedException cnse) {
    throw new DigestException("couldn't make digest of partial content");
}

만약 구현이 복제 가능하지 않다면, 필요한 다이제스트 수를 미리 알 때 여러 인스턴스를 만들어 중간 다이제스트를 계산할 수 있습니다. 모든 Java 플랫폼 구현은 SHA-1, SHA-256 표준 다이제스트 알고리즘을 지원해야 합니다.

MessageDigest의 주요 메서드는 다음과 같습니다.

  • public static MessageDigest getInstance(String algorithm) — 지정된 다이제스트 알고리즘을 구현하는 MessageDigest 객체를 반환합니다.
  • public static MessageDigest getInstance(String algorithm, String provider) — 지정된 프로바이더에서 알고리즘을 지원하는 객체를 반환합니다.
  • public static MessageDigest getInstance(String algorithm, Provider provider) — 주어진 Provider 객체로 객체를 반환합니다.
  • public void update(byte input) — 지정된 바이트로 다이제스트를 갱신합니다.
  • public void update(byte[] input, int offset, int len) — 지정된 바이트 배열의 일부로 다이제스트를 갱신합니다.
  • public void update(byte[] input) — 지정된 바이트 배열로 다이제스트를 갱신합니다.
  • public final void update(ByteBuffer input) — 지정된 ByteBuffer로 다이제스트를 갱신합니다.
  • public byte[] digest() — 패딩 같은 마지막 연산을 수행해 해시 계산을 완료하고 다이제스트를 반환합니다.
  • public int digest(byte[] buf, int offset, int len) — 해시 계산을 완료하고 결과를 buf에 저장합니다.
  • public byte[] digest(byte[] input) — 먼저 input으로 update를 수행한 뒤 다이제스트 계산을 완료합니다.
  • public static boolean isEqual(byte[] digesta, byte[] digestb) — 두 다이제스트를 비교합니다. 길이와 모든 바이트가 같으면 같다고 판정합니다.
  • public void reset() — 다이제스트를 재사용할 수 있도록 재설정합니다.
  • public final String getAlgorithm() — 구현과 무관한 알고리즘 식별 문자열(예: "SHA-256")을 반환합니다.
  • public final int getDigestLength() — 다이제스트의 바이트 길이를 반환합니다.
  • public Object clone() — 객체의 복제본을 반환합니다.

지정된 알고리즘을 지원하는 프로바이더가 없으면 NoSuchAlgorithmException이 발생할 수 있습니다.

더 알아보기 (Learn more)

Java 공식 API