Hatena::ブログ(Diary)

未来は僕以外の手の中

2009-07-30

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

| 08:27 | 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での暗号化認証コード生成はこんな感じなのかな〜。

hitoshi_u1104hitoshi_u1104 2009/08/28 15:06 HMACは暗号化とは関係なくて、共通鍵を使った改竄検知用の署名ですよ。HMACは否認防止はできないから、そこまでやるなら、秘密鍵で署名して、証明書の公開鍵で検証が必要です。
暗号化を実装するなら、Diffie-Hellmanの鍵共有とか、対称・非対称暗号化方式のことで、JCEで簡単に実装できますよ〜

billestbillest 2009/08/29 14:08 ご指摘ありがとうございます。確かにこれ暗号化ではないですね、混乱していました〜(><)。
暗号化はJCEで出来るんですね、今度いじってみたいと思います!
参考になるコメント、ありがとうございました。

トラックバック - http://d.hatena.ne.jp/billest/20090730/1248910076