2004/01
まず、Base64ってなんやねん?ということですが、メールとかで
使われてる符号化形式です。可逆変換であって変換したものを
元に戻せます。変換するのをencodeBase64()、元に戻すのをdecodeBase64()
として実装しました。
それとLDAPのパスワードはBase64エンコードをしてからSHAハッシュ値に
変換したものを格納してます。なので、LDAPに登録してるユーザの認証
をするような場合に入力されたパスワードをLDAPに格納されてる形式に
変換して比較する必要があります。この機能を実装した
encriptPassword()ってメソッドを作ってみました。
んじゃ、ソース行ってみよう!
package etc;
import java.io.*;
import javax.mail.internet.MimeUtility;
import javax.mail.MessagingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 文字列をBase64にエンコード、デコードを行う。
* @author yamarou
*/
public class Base64Util {
public static void main(String[] args) throws Exception {
String s = args[0];
System.out.println("元の文字列 " + s);
String enc = Base64Util.encodeBase64(s);
System.out.println("エンコード後 " + enc);
String dec = Base64Util.decodeBase64(enc);
System.out.println("デコード後 " + dec);
String pass = Base64Util.encryptPassword(s);
System.out.println("LDAPパスワード形式に変換後 " + pass);
}
/**
* 引数strをBase64エンコーディングする。
* @param str 文字データ
* @return 符号化文字列
*/
public static String encodeBase64(String str)
throws IOException, UnsupportedEncodingException, MessagingException {
return encodeBase64(str.getBytes());
}
/**
* 引数strをBase64エンコーディングする。
* @param data バイト型文字データ
* @return 符号化文字列
*/
private static String encodeBase64(byte[] data)
throws IOException, UnsupportedEncodingException, MessagingException {
ByteArrayOutputStream bao = new ByteArrayOutputStream();
OutputStream out = MimeUtility.encode(bao, "base64");
out.write(data);
out.close();
return bao.toString("iso-8859-1");
}
/**
* 引数strをBase64デコーディングする。
* @param data 文字データ
* @return 復号化文字列
*/
public static String decodeBase64(String str)
throws IOException, UnsupportedEncodingException, MessagingException {
return decodeBase64(str.getBytes());
}
/**
* 引数strをBase64デコーディングする。
* @param data バイト型文字データ
* @return 復号化文字列
*/
private static String decodeBase64(byte[] data)
throws IOException, UnsupportedEncodingException, MessagingException {
InputStream in = MimeUtility.decode(
new ByteArrayInputStream(data), "base64");
byte[] buf = new byte[1024];
ByteArrayOutputStream out = new ByteArrayOutputStream();
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
return new String(out.toByteArray());
}
/**
* 引数strをLDAPのパスワード形式に変換する。
* @param str 文字データ
* @return 暗号化文字列
*/
public static String encryptPassword(String str)
throws NoSuchAlgorithmException,
IOException, UnsupportedEncodingException, MessagingException{
// SHAハッシュ化
MessageDigest md = MessageDigest.getInstance("SHA");
byte[] data = str.getBytes();
md.update(data);
byte[] hashVal = md.digest();
return "{SHA}" + encodeBase64(hashVal);
}
}
実行しましょう!
このプログラムはJavaMailパッケージを使っているので
JavaMailをダウンロードして、その中にあるmail.jar、
またはJ2EESDKをダウンロードして、その中にあるj2ee.jar
にクラスパスを通します。
> set CLASSPATH=CLASSPATH;.;j2ee.jar
このメルマガをBase64Util.javaって名前で保存して
> javac -d . Base64Util.java
> java etc.Base64Util やまろう
[実行結果]
エンコード後 guSCpIKxguiC8Q==
デコード後 やまろう
LDAPパスワード形式に変換後 {SHA}TaDOW3uqSMa3oOM5EWFz2tuChec=
"やまろう"をBase64エンコードすると"guSCpIKxguiC8Q===="になって
デコードすると"やまろう"に戻ってます。
LDAPパスワード形式に変換すると"{SHA}TaDOW3uqSMa3oOM5EWFz2tuChec="
になってます。こちらはSHAハッシュ化しているので、元に戻すことは
出来ません。
ってなわけで、いかがだったでしょうか?Base64とか、SHAとかはユーザ認証
でよく出てきます。ログイン画面とか作る時にきっと役に立つと思います。
んじゃ
やまろう