LoginSignup
1
2

【Java】文字列をハッシュ化する

Posted at

はじめに

これまでにPowerShellExcelVBADOSコマンドを使ってハッシュ値を求める方法を記事としてまとめましたが、今回はJavaで文字列をハッシュ化する方法を備忘録としてまとめてみました。

作成したコード

  • Javaでハッシュ値を求める場合、MessageDigestというクラスを使います。
  • MessageDigest.getInstance()でMessageDigestクラスのインスタンスを作りますが、この際にハッシュアルゴリズムの指定を誤るとNoSuchAlgorithmException、ハッシュアルゴリズムがnullだとNullPointerExceptionが発生します。
    • ハッシュアルゴリズムの書き間違いでNoSuchAlgorithmExceptionが発生しないように、ここではenumのHashAlgorithmを使ってハッシュアルゴリズムを指定しています。
  • MessageDigest#digest(byte[])でハッシュ値を計算するためのバイト列の指定をして、ハッシュ計算を完了させます。
    • バイト列が複数ある時は、MessageDigest#update(byte[])を複数回呼び出した後にMessageDigest#digest()でハッシュ計算を完了させるようです。(※この点については試していないので不確かですが...)
TextEncoder.java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class TextEncoder {

	/**
	 * ハッシュアルゴリズムの種類
	 * https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#MessageDigest
	 * @author NKOJIMA
	 */
	private enum HashAlgorithm {
		MD5,
		SHA1,
		SHA256,
		SHA512
	}

	public static void main(String[] args) {
		String text = "qwerty2024";

		System.out.println("MD5: " + toHash(text, HashAlgorithm.MD5));
		System.out.println("SHA-1: " + toHash(text, HashAlgorithm.SHA1));
		System.out.println("SHA-256: " + toHash(text, HashAlgorithm.SHA256));
		System.out.println("SHA-512: " + toHash(text, HashAlgorithm.SHA512));
	}

	/**
	 * 文字列を指定した暗号化アルゴリズムでハッシュ化する。
	 * @param text 暗号化する文字列
	 * @param algorithm 暗号化アルゴリズム
	 * @return ハッシュ化された文字列。
	 */
	private static String toHash(String text, HashAlgorithm algorithm) {
		String hashAlgorithm = "";
		if (algorithm==HashAlgorithm.MD5) {
			hashAlgorithm = "MD5";
		} else if (algorithm==HashAlgorithm.SHA1) {
			hashAlgorithm = "SHA-1";
		} else if (algorithm==HashAlgorithm.SHA256) {
			hashAlgorithm = "SHA-256";
		} else {
			hashAlgorithm = "SHA-512";
		}

		StringBuffer sb = new StringBuffer();
		try {
			MessageDigest md = MessageDigest.getInstance(hashAlgorithm);
			byte[] cipherBytes = md.digest(text.getBytes());

			for (int i=0; i<cipherBytes.length; i++) {
				sb.append(String.format("%02x", cipherBytes[i]&0xff));
			}
		} catch (NoSuchAlgorithmException ex1) {
			System.out.println("ハッシュアルゴリズム名が不正です。");
		} catch (NullPointerException ex2) {
			System.out.println("ハッシュアルゴリズム名が指定されていません。");
		}

		return sb.toString();
	}
}
実行結果
MD5: ba90bf4e632e2c47969a737c7f10e8ed
SHA-1: d0219b87cc88f83402a9a028cbe234e2c377a591
SHA-256: 27ee1080a481ba14a90066fcd22e1ef654539d94ff0b768905b9313abd6313bc
SHA-512: c3766c875ce0f0448fb93d24ff9d6d01e7d4dabda7f3713fd2b79c6a54cd18558151aaeb76132feb15fd1203914d1a39a5bcef6c8e16f776ca28de0aff70abcf

補足

  • 上記のプログラムの結果は、RubyのDigestクラスを使って結果を検証しています。

参考URL

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2