Before  Home  Next 


 ユーザ登録時にパスワードを暗号化する



1) はじめに

ログイン機能(前編)では、ユーザ情報の登録の仕方について 説明してきました。
WeberCreatorのユーザ登録機能をそのまま実行すると、パスワードは平文のままDBに登録されて しまい、セキュリティ上好ましくありません。


暗号化前のユーザテーブルの状態


ここでは、ユーザ登録機能にパスワードの暗号化処理を追加する手順について解説したいと 思います。


2) アクションクラスの修正

まずはアクションクラスから修正してきます。
修正の対象となるクラスは以下の3クラスになります。

修正対象クラス一覧

  • sample.user.UserRegistAction.java(ユーザ登録アクション)
  • パスワードを暗号化します。

  • sample.user.UserUpdateAction.java(ユーザ更新アクション)
  • パスワードを暗号化します。

  • sample.user.UserDisplayUpdateAction.java(ユーザ更新画面表示アクション)
  • パスワードを復号化します。


    (1) ユーザ登録アクション(ユーザ更新アクション)の修正

    public class UserRegistAction extends UserBaseAction {
        /**
         * 登録処理を行います
         * @param bucket ActionBucketインスタンス
         * @return 実行結果を返します(遷移先のファイル形式はモジュール名_実行結果.拡張子)
        */
        public String doExecute(ActionBucket bucket) throws Exception{
            User bean = (User)bucket.getForm();
            UserDao dao = new UserDao();
            
            //パスワードを暗号化します
            String pwd = AngouUtil.encryptStr(bean.getName(), bean.getPassword());
            bean.setPassword(pwd);
            
            dao.save(bean);		//更新処理の場合はdao.update(bean);
            ・・・(以下省略)
        }
    

    赤字で記載している箇所が修正箇所です。
    AngouUtilクラスのencryptStrメソッドを使ってパスワードを暗号化しています。
    encryptメソッドを実行すると暗号化アルゴリズム「Blowfish」によるパスワードの暗号化が 行われます。
    第1引数にユーザ名を、第2引数にはパスワードを指定します。
    encryptメソッドの戻り値が暗号化されたパスワードになります。

    ユーザ登録アクションの修正が終わったら、ユーザ更新アクションも同様に、 暗号化処理を追加しましょう。


    (2) ユーザ更新画面表示アクションの修正

    ユーザ更新画面を表示する際、暗号化されたパスワードを復元します。

    public class UserDisplayUpdateAction extends UserBaseAction {
        
        /**
         * 更新画面表示処理を行います
         * @param bucket ActionBucketインスタンス
         * @return 実行結果を返します(遷移先のファイル形式はモジュール名_実行結果.拡張子)
        */
        public String doExecute(ActionBucket bucket) throws Exception{
            UserDao dao = new UserDao();
            //フォームには主キー項目がセットされているものとします
            User form = (User)bucket.getForm();
            User bean = dao.getUser(form);
            
            //パスワードを復号化します
            String pwd = AngouUtil.decryptStr(bean.getName(), bean.getPassword());
            bean.setPassword(pwd);
            
            bucket.setAttribute("user", bean);
            ・・・(以下省略)
        }
    

    赤字で記載している箇所が修正箇所です。
    AngouUtilクラスのdecryptStrメソッドを使ってパスワードを復号化しています。
    第1引数にユーザ名を、第2引数にはパスワードを指定します。
    decryptStrメソッドの戻り値が復号化されたパスワードになります。


    3) 動作確認1

    アクションクラスの修正が終わったら、実際に動作を確認してみましょう。

    まずはユーザ登録画面から以下のユーザを登録してみます。


    ユーザ登録


    ユーザ一覧画面で登録されたユーザのパスワードが暗号化されていることを確認してください。


    ユーザ一覧画面


    次にユーザ一覧画面から先ほど作成したユーザのパスワードを変更してみましょう。
    ユーザ一覧画面のtestユーザより"更新"ボタンを押下してみてください。


    ユーザ更新画面


    パスワードが複合化されて表示されていることが確認できます。

    又、testユーザでログインできるかテストしてみてください。


    4) HTMLの修正

    パスワードの暗号化、複合化はアクションクラスを修正するだけで実現できますが、 ユーザ一覧画面や登録・更新画面のパスワードが画面に表示されてしまうのは あまり好ましくありません。
    ここでは、パスワードの入力項目をパスワードフィールドに変更してみたいと思います。

    修正の対象となるHTMLは以下の3ファイルになります。

    修正対象クラス一覧

  • user_regist.html(ユーザ登録画面)
  • パスワード入力フィールドをpasswordに変更します。

  • user_update.html(ユーザ更新画面)
  • パスワード入力フィールドをpasswordに変更します。

  • user_search.html(ユーザ一覧画面)
  • パスワード表示項目を"*****"に変更します。


    (1) ユーザ登録画面(ユーザ更新画面)の修正

    <p>パスワード(password)<input type="password" name="password" value="${user.password}"/></p>
    

    (2) ユーザ一覧画面の修正

    <table border="1" cellspacing="1" cellpadding="1" width="100%">
        <tr>
            <td>ID</td>
            <td>ユーザ名</td>
            <td>パスワード</td>
            <td>権限名</td>
            <td>編集</td>
            <td>削除</td>
        </tr>
        <span w_kind="iterate" w_id="one_message" w_name="user_list">
        <tr>
            <td>${one_message.id}</td>
            <td>${one_message.name}</td>
            <td>*****</td>
            <td>${one_message.role.name}</td>
            <td><div onclick="window.location.assign('display_update.wb?
               submit_update=true&id=${one_message.id}');"><u>
                  編集</u></div></td>
            <td><div onclick="if( confirm('削除しますか?') ) 
               window.location.assign('delete.wb?id=${one_message.id}');"><u>
                  削除</u></div></td>
        </tr>
        </span> 
    </table>
    

    5) 動作確認2

    HTMLの修正が終わったら、再度コンパイルし、動作を確認してみてください。


    ユーザ一覧画面


    ユーザ一覧画面のパスワードフィールドが"*****”で表示されています。


    ユーザ更新画面


    パスワードの入力フィールドが”*****”で表示されています。


    Before  Home  Next