[PR]テレビ番組表
今夜の番組チェック

目次 Vol.26 Base64エンコード & デコード & LDAPパスワード変換
                                                               /*
やまろうのJavaなわけ
                     2004/01
Vol.26 Base64エンコード & デコード & LDAPパスワード変換

「歯磨きは奥が深い」でおなじみのやまろうです。

僕ってけっこう長いこと歯医者に通ってて、いつになったら
終わるんだよって感じだったんですが、4ヶ月ほど前に
「今日で治療が終わりました。3ヵ月後に検診に来て下さい」
って言われてたので4ヶ月たったので(あれ?3ヶ月?)、また
歯医者に行きました。というか、すげー歯が茶色くなってしまって
ヘビースモーカーの人みたくなってしまったから行ったっちゅうねん!

歯石がたまったのかなぁと思ったら、そうじゃなくてお茶とか
コーヒーの色が歯についてしまったのが原因だそうです。
でもって、なんでそんなことになったかっちゅうと、
前に歯磨きの仕方教えてもらって、その時に歯磨き粉は歯が削れるので
あまり付けない方が良いっていうから、全然付けないでいたのねん。
さすがに全く使わないのは良くないらしく何回か磨くうちの1回は
付けた方が良いとのことです。

歯磨きって難しいですよねー。前に「歯茎が腫れてますねぇ」って
言われたもんだから、歯周病か?(歯周病ってのは、歯と歯茎の間に
歯周病原菌が蔓延して歯茎が腫れて、症状が進むと歯茎が衰えて
歯がぐらぐらしてきて、最後には歯が抜けちゃうっていう恐ろしい病気、
国民のほとんどが重からず感染している)と思って、一生懸命磨いて
たら、結局、力入れすぎで、歯茎を擦り過ぎて腫れてたっていうオチで
した。歯はやさしく磨くものなんだとさ!よく勢いよくシャカシャカ
やってる人いるけど、本当はもっと細かくウリウリウリって掻き出す
感じでやった方がいいみたいっすよ!

何事も力を抜いてやさしく行うのがいいってことだすなー!!
なんか前にもこんなこと書いたような気が・・・?
わかっていても、答えを見つけるまでには、苦労するもんなんだねぇ。
きっとそうやって、壁にぶつかっては、もがき、答えを探すということを
繰り返していくのが、人生なのかねー。

「どうして同じようなパンチ何度もくらっちゃうんだ」
                                 宇多田ヒカル SAKURAドロップス
*                  *                  *                  *                  *


それでは本題「Base64エンコード & デコード & LDAPパスワード変換」

まず、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とかはユーザ認証 でよく出てきます。ログイン画面とか作る時にきっと役に立つと思います。 んじゃ やまろう ■発行者メールアドレス(ご意見、ご感想、ご要望、ご質問等) yamarou@mail.goo.ne.jp ■発行者webサイト(バックナンバー一気に読めます、リンクで跳べます) http://yamarou.at.infoseek.co.jp/mag.html ■やまろうの読書なわけ(読んだ本の感想等) http://yamarou.at.infoseek.co.jp/book.html ■バックナンバー・登録・解除・メールアドレスの変更 http://www.mag2.com/m/0000103290.htm このメールマガジンは、「まぐまぐ」の配信システムを利用して発行しています。 */
目次