1

現在、を使用してOracleデータベースのパスワードフィールドをハッシュしていますDBMS_CRYPTO.HASH。ただし、この時点で、MySQLと同様の方法で、Javaアプリケーションがユーザー入力時にパスワードを認証できるようにする必要があります。何かのようなもの:

SELECT *
FROM user_login_table
WHERE password = SHA1('MyPassword');

現在、次の手順でハッシュしています。

CREATE OR REPLACE PROCEDURE 
  MUNGAI.p_auth_insert_user (
    par_username in varchar2,
    par_password in varchar2,
    par_work in varchar2
  )
IS l_hash raw(2000);
  BEGIN
    l_hash :=
      dbms_crypto.hash(
        utl_i18n.string_to_raw(par_password || par_work || upper(par_username),
        'AL32UTF8'
      ),
      dbms_crypto.hash_sh1
    );

    INSERT INTO user_login_table (user_name, p_word, work_class)
    VALUES (par_username, l_hash, par_work);
  END p_auth_insert_user;
/

次に、次の手順を実行して、テーブルに挿入します。

EXEC MUNGAI.p_auth_insert_user('MUNGAI', 'gatungo', '999')

私の状況でこれを達成するためのより良い方法はありますか?重要な場合は、Oracle11gを使用しています。

4

2 に答える 2

4

データベースの外部で、コード内でハッシュを実行することをお勧めします。このように、DBベンダーに依存せず、ハッシュ実装を1か所にのみ書き込む必要があります。DB列は通常のvarcharにすることができます。

これは次のようになります。

  1. ユーザーを追加/パスワードを変更する場合、挿入/更新の前に、適切なアルゴリズムとソルトを使用して提供されたパスワードをハッシュします。少なくともSHA-256をお勧めします。ハッシュの横にも塩を保存してください!

  2. 認証中に、ユーザーのハッシュとソルトを取得し、提供されたパスワードをソルトでハッシュして、データベースのハッシュと比較します。

たとえばここでハッシュ/ソルティングのヒント:http://crackstation.net/hashing-security.htm

于 2012-09-17T19:14:20.193 に答える
3

RAWハッシュされたパスワードがの列に格納されていると仮定すると、SQLステートメントをuser_login_table呼び出すだけで済みます。dbms_crypto.hash最初のハッシュをどのように行っているか(特に、プレーンテキストのパスワードをどのように変換しているRAWか、どのアルゴリズムとオプションを使用しているか)に応じて、このようなものが機能します

select * 
  from user_login_table 
 where password = dbms_crypto.hash( utl_i18n.string_to_raw( 'MYPassword', 'AL32UTF8' ),
                                    <<whatever hash algorithm you want to use>> );

もちろん、優れたコーディング慣行の一般的な問題として、パスワードをハッシュする独自の関数を定義して、文字列をaに変換しRAW、ハッシュアルゴリズムを1か所で指定する方法のロジックを埋め込むことができるようにする必要があります。次に、SQLステートメントからその新しい関数を呼び出します。これは、おそらく適切な塩も追加する関数です。次に、その関数を使用して、テーブル内のハッシュデータの初期シードを実行し、将来的にパスワードハッシュを検証します。

また、実際のクエリには、usernameパスワードに加えて述語が含まれていると思います

select * 
  from user_login_table 
 where password = new_function_name( 'MYPassword' )
   and username = 'YourUserName'

それ以外の場合、投稿したクエリは、パスワードがログインしようとした特定の人ではなく、データベース内の誰かのパスワードと一致することを検証するだけです。さらに、2人が同じパスワードハッシュを持っている場合、複数の行が返されます。

したがって、あなたの特定のケースでは、新しい関数を作成したいと思うでしょうhash_password

CREATE OR REPLACE function MUNGAI.hash_password(par_username in varchar2,
                              par_password in varchar2,
                              par_work in varchar2
                             )
  return raw
is
  l_hash raw(2000);
begin
  l_hash :=
   dbms_crypto.hash
     (utl_i18n.string_to_raw (par_password || par_work || upper(par_username),
                              'AL32UTF8'
                             ),
      dbms_crypto.hash_sh1
     );
  return l_hash;
end;

次に、挿入プロシージャからこの関数を呼び出します

CREATE OR REPLACE procedure MUNGAI.p_auth_insert_user (par_username in varchar2,
                              par_password in varchar2,
                              par_work in varchar2
                             )
is
  l_hash raw(2000);
begin
  l_hash := hash_password( par_username, par_password, par_work );

  insert into user_login_table
    (user_name, p_word, work_class)
   values
    (par_username, l_hash, par_work);
end p_auth_insert_user;
/

クエリは次のようになります

select * 
  from user_login_table 
 where password = new_function_name( username, 
                                     'MYPassword', 
                                     <<whatever `par_work` is supposed to be>> )
   and username = 'YourUserName'
于 2012-09-17T20:42:45.657 に答える