« WebObjects:メモリ不足エラー対応 | トップページ | JavaMail:メール送信でOP25B対応 »

Java:ログインパスワードを暗号化する

Webアプリケーションなどでは,アクセス時にパスワードによるログイン認証を行う場合があります。
ここではその具体的な実装のうち,データベースやパスワードファイルに格納するログインパスワードの暗号化について述べてみたいと思います。

【概要】
複数のユーザが個別にユーザ名とパスワードを設定する場合,そのアカウント情報はデータベースなどに保存するようになると思います。
このときパスワードをそのまま保存してしまうと,パスワードはデータベースを閲覧できるすべての人に知られてしまいます。また,Base64変換や元に戻せる暗号にした場合でも,元に戻せる技術をもった人にパスワードを知られてしまう可能性があります。そのため,パスワードを保存する場合は不可逆暗号にするのが一般的かと思います。
不可逆暗号とは元に戻せない暗号です。不可逆暗号を使ってパスワード認証を行うには,暗号化したパスワードをデータベースにあらかじめ保存しておき,ユーザがログインした時にユーザが入力したパスワードを暗号化して,データベースに保存されている暗号化されたパスワードと同一になるかどうかで正しいパスワードか判断することができます。不可逆のメリットとしては,元に戻せないのでパスワードの漏洩が防げると同時に,データベースを閲覧できる人にパスワード窃盗の嫌疑がかかるのを防ぐことができます。デメリットとしては,元に戻せないのでユーザがパスワードを忘れてしまったらパスワードを登録し直すしか手がないことです。

パスワードだけを暗号化した場合,同じパスワードの人がいた場合に同じ暗号データがデータベースに登録されてしまい,データベースを閲覧した人に同じパスワードであることがわかってしまう可能性があります。この対策としては,(ユニークな)ユーザ名とパスワードを加えて暗号化すれば良いかと思います。

【Javaによる不可逆暗号の実装】
Javaにはメッセージダイジェストを作成するクラスがありますので,これを使って不可逆暗号を作ることができます。具体例として下記のようなコードになります。
なお,このコードではユーザ名がNULLであることを想定していません。なぜならユーザ名はアカウントを特定するユニークキーなので,必須であるべきだからです。ユーザがユーザ名を入力しなかった場合は,このメソッドを呼ぶ前にエラーではじくべきです。
※このコードでは,メッセージダイジェストをテキストに変換するために,当初Base64エンコードしていましたが,バイトごとの数値を文字列に変換して連結する実装に改めました(2015/02/16)

import java.security.*;
 
/**
* パスワードを不可逆暗号化する.
*/
public class PassDigest
{
  //------------------------------------------------------------------
  /**
   * ユーザ名とパスワードでメッセージダイジェストを作成し文字列化して返す.
   * @param userName ユーザ名.
   * @param password パスワード.
   * @return 生成したダイジェスト.
   * @throws NoSuchAlgorithmException Java実行環境にSHA-1が実装されていない.
   */
  public static String build (
    String userName,
    String password)
    throws NoSuchAlgorithmException
  {
    StringBuilder buff = new StringBuilder();
    if (password != null && !password.isEmpty()) {
      MessageDigest md = MessageDigest.getInstance("SHA-1");
      md.update(userName.getBytes());
      md.update(password.getBytes());
      byte[] digest = md.digest();

      for (byte d : digest) {
        buff.append((int)d&0xFF);
      }
    }
    return buff.toString();
  }
}

最終更新日:2015/02/16
※上記コードでは,整形のため全角スペースを使用している部分があります。
【著作権表記】上記コードを含む本ブログのプログラムコードは,私的利用可,商用利用可,改変しての利用可です。利用の際に作者に許諾を得る必要はありません。

■関連情報
Sun:Java暗号化アーキテクチャ API の仕様およびリファレンス
クラスMessageDigest(Javadoc)

■関連書籍をAmazonで検索:[Java]
Javaで作って学ぶ暗号技術 - RSA,AES,SHAの基礎からSSLまで



にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ プログラム・プログラマへ 人気ブログランキングへ ←この記事が役に立ったという方はクリックお願いします。


ioPLAZA【グラフィック(内蔵)】ブックオフオンライン【PC・携帯共通】

|

« WebObjects:メモリ不足エラー対応 | トップページ | JavaMail:メール送信でOP25B対応 »

Java」カテゴリの記事

プログラミング」カテゴリの記事

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/505963/40222829

この記事へのトラックバック一覧です: Java:ログインパスワードを暗号化する:

« WebObjects:メモリ不足エラー対応 | トップページ | JavaMail:メール送信でOP25B対応 »