MessageDigest
MessageDigest (메시지 다이제스트)
SHA-1, SHA-256 같은 메시지 다이제스트(해시) 알고리즘의 기능을 애플리케이션에 제공하는 클래스입니다. 메시지 다이제스트는 임의 크기의 데이터를 받아 고정 길이 해시 값을 내는 안전한 단방향 해시 함수입니다.
본문
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이 발생할 수 있습니다.