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とかはユーザ認証
でよく出てきます。ログイン画面とか作る時にきっと役に立つと思います。
んじゃ
やまろう