読者です 読者をやめる 読者になる 読者になる

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Java Commons Codecを使って、MD5でハッシュ化してみる。

<スポンサーリンク>

タイトルが不自然な日本語だけど、要はJavaMD5を使って文字列をハッシュ化してみようという話。

その背景としては、はてなAPIのページに関心を持ったため、ちょっとずつ色々試そうかと思ったこと。

自分はあまりネットサービスを使いまくったりはしないんだけど、そんなネットに疎い(?)自分がやっぱり好きなのが、はてなのサービスなわけで。
それならちょっとでも、はてなのAPIにも興味を持っていこうと思った次第であります。

で、はてなのアプリを作るには、以下の手順を経る必要がある。
そのうち、「3」の部分でMD5を使ったハッシュ化が必要なので、今回はJavaで実装してみようと考えた。

1. APIキーを取得する
2. APIキーの設定を行う
3. ログイン用のリンクを作成する
4. 認証ハンドラを作成する
5. 認証APIを呼び出す
みたいな手順が必要なようだ。

詳細は以下のリンクを参照。
http://auth.hatena.ne.jp/help/api

今日はもう夜になったし、明日はクリスマスイブなので、とりあえず「3」の部分までやってみる。

リンク先の、

秘密鍵が e7b59cdcceaa3904
api_key が a47d51a93bafc7d1160efd712c6931bd
だった場合、e7b59cdcceaa3904api_keya47d51a93bafc7d1160efd712c6931bd と連結(秘密鍵 + 'api_key' + [api_key の値])した文字列の MD5 を取ります。その値が api_sig の値になります。

という部分が若干わかりづらいけれど、なんとか実装してみよう。

まずは、MD5でハッシュ化を行うモジュールを提供しているCommons Codecのjarをダウンロードしてみる。
こちらがcommons codecの公式サイトなんだけど、このサイトからダウンロードしたものはなんかうまく使えない?という謎の現象が起きた。
http://commons.apache.org/proper/commons-codec/download_codec.cgi

そのため、以下のsourceforgeからダウンロードしたものを使っている。
http://sourceforge.jp/projects/sfnet_crosspather/downloads/Dependencies/Runtime/commons-codec.jar/

で、手に入れたjarをビルドパスに通して、以下のようなコードを書いてみた。

package oauth.sample;

import org.apache.commons.codec.digest.DigestUtils;

public class OAuthUtil {
	private static final String OUTH_URL_ORG = "http://auth.hatena.ne.jp/auth?api_key=";
	
	public static String getMd5 (String orgData) {
		String md5 = DigestUtils.md5Hex(orgData);
		return md5;
	}
	
	public static String getLoginSignature (String privateKey, String apiKey) {
		String signature = null;
		StringBuffer sb = new StringBuffer();
		sb.append(privateKey);
		sb.append("api_key");
		sb.append(apiKey);
		
		signature = getMd5(sb.toString());
		return signature;
	}
	
	public static String getAuthenticationUrl(String apiKey, String apiSignature) {
		StringBuffer authUrl = new StringBuffer();
		authUrl.append(OUTH_URL_ORG);
		authUrl.append(apiKey);
		authUrl.append("&api_sig=");
		authUrl.append(apiSignature);
		
		return authUrl.toString();		
	}
}

md5を取得するのは、単純に以下の部分。

public static String getMd5 (String orgData) {
	String md5 = DigestUtils.md5Hex(orgData);
	return md5;
}

で、上のクラスを使ってみたのが、以下のMainクラス。

package oauth.sample;

public class Main {
	private static String privateKey = "hogehogehogehoge2121";
	private static String apiKey = "fugafugafugafuga1112";
	public static void main(String[] args) {
		String signature = OAuthUtil.getLoginSignature(privateKey, apiKey);
		System.out.println("シグニチャはこんな感じ→" + signature);
		
		String url = OAuthUtil.getAuthenticationUrl(apiKey, signature);
		System.out.println("リクエストで投げるURLはこんな感じ→" + url);
	}
}

実行すると、こんな結果が。

シグニチャはこんな感じ→8d670b8f3489ced8ac15005db933c993
リクエストで投げるURLはこんな感じ→http://auth.hatena.ne.jp/auth?api_key=fugafugafugafuga1112&api_sig=8d670b8f3489ced8ac15005db933c993

で、ここで取得したURLにリクエストを投げてみると・・・・
f:id:sho322:20131224010800j:plain
ほら、こんな感じではてなの認証画面らしきものが出てきた!

続きは「4」からやることになる。
とりあえず、今日はここまで。