未来は僕以外の手の中

SI屋がIT技術やビジネスのことなどを気ままに書き綴ってみるなど

Javaで認証コード生成(HMAC-SHA1)

【追記】暗号化→認証コード生成に修正 2009/08/29

ハッシュ関数を用いて「秘密鍵」と「認証すべき任意長のメッセージ」から暗号認証コード(MAC値)を生成する。HMACの詳細はHMAC(by Wiki)で。


まずはこの記事から引用(一部改変)

import javax.crypto.*;
import org.apache.commons.codec.binary.Hex;

public class hmacsha1 {
  public static void main(String[] args) throws Exception {
    KeyGenerator kg = KeyGenerator.getInstance("HmacSHA1");
    SecretKey sk = kg.generateKey(); // skが秘密鍵

    Mac mac = Mac.getInstance("HmacSHA1");
    mac.init(sk);
    byte[] result = mac.doFinal("hoge".getBytes()); // "hoge"が認証メッセージ
    System.out.println(new String(Hex.encodeHex(result))); 
    }
}

出力例は以下の通り。

06f3f3bf2acac18af258313041da55fbca82a82648686b78adac9839e


なお、上記サイトにもあるようにbyte配列をprintするのにtoString()ではうまくいかない。
そこで、Hex関数を使うとよさ気。指定された値を16進数文字列で返す関数。
jarファイル置き場はココです。commons-codec-1.3.zipがいいかも。


どうやら以下の部分にて秘密鍵は自動生成してくれてるらしい。

    KeyGenerator kg = KeyGenerator.getInstance("HmacSHA1");
    SecretKey sk = kg.generateKey(); // skが秘密鍵

自分で定めた秘密鍵を使いたい場合は、上の2行を以下に置き換える。

    String kagi = "geho"; // "geho"が秘密鍵
    SecretKeySpec sk = new SecretKeySpec(kagi.getBytes(), "HmacSHA1");

(import javax.crypto.spec.SecretKeySpec;が必要)


とりあえずJavaでの暗号化認証コード生成はこんな感じなのかな〜。