便利なコードパーツ集!

やまろうのプログラミングTips

Java

Base64エンコード & デコード & LDAPパスワード変換

投稿日:

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

スポンサーリンク

-Java

Copyright© やまろうのプログラミングTips , 2022 AllRights Reserved Powered by AFFINGER4.