2011-07-06 4 views
0

サーブレットと休止状態を使用する私のWebアプリケーションでは、パスワードを入力した顧客を認証する必要があります。データベース内のレコードと一致するユーザーのパスワード

彼はデータベースにすでに含まれている場合、私は自分のパスワードがdb.Forのレコード新しい顧客を、私はパスワードを取り、彼のためにレコードを作成したいと一致するかどうかを確認する必要があります。 私はシナリオでこのようにしました。

既存の顧客は今EMAILADDRESSとパスワード

String email = req.getParameter("emailAddress"); 
String password = req.getParameter("password"); 
Customer cust = dao.findByEmailAddress(email); 

に入り、どのようにこのCUSTオブジェクトがパスワードに関連付けられている場合、私はチェックして、それは、ユーザが入力したものと一致していますか? ManningのHibernateブックの例では、CustomerクラスのStringとしてパスワードが格納されています。これは良いアイデアですか?これはどのようにデータベースに保存されますか?

休止状態を使用して、どのようにこれを処理することができますか?私は人々がパスワードをハッシュとして保存することについて言及しているのを聞いた。しかし、私は私のアプリでこれをどのようにすることができるのかよくわからない。

私はこれにどのように取り組むことができますか?

答えて

2

パスワードの保存方法を決定する必要があります。それらをHibernateエンティティに文字列として格納すると、データベースのvarcharにクリアテキストで格納されます。したがって、データベースにアクセスできる人は誰でもそれらを見ることができます。この場合の認証は、送信されたパスワードとデータベース内のパスワードを比較することにあります。

最初のものはデータベースに格納する前に、秘密鍵とそれらを暗号化することにある二つの他の可能性があります。しかし、この秘密鍵は、あなたのアプリケーションがそれらを解読し、解読されたパスワードをユーザーが送ったものと比較するために、どこかに格納しなければなりません。しかし、少なくともアプリケーション展開ディレクトリへのアクセス権を持っている人だけにパスワードの可視性を減らすことができます。この場合の認証は、データベースに格納されたパスワードを秘密鍵で復号化し、それをユーザが送信したパスワードと比較することにあります。両者が等しい場合、ユーザーは正しいパスワードを送信しました。

最後の可能性は、メッセージダイジェストアルゴリズムとして知られている(例えば、SHA-1のような)一方向ハッシュアルゴリズムを使用することであろう。この方法では、秘密鍵は必要ありません。誰でもパスワードにアクセスできるようにするのは非常に難しいでしょう(ほとんど不可能です)。このソリューションの欠点は、ユーザーがパスワードを失った場合、そのユーザーを送信できなくなることです。唯一の可能性は、彼を新しい価値にリセットし、この新しいパスワードをユーザに送り、新しいパスワードを選択するように頼むことです。この場合、ユーザーの認証は、送信したパスワードをハッシュし、データベースに格納されているハッシュと比較します。より詳細な説明については

読むhttp://en.wikipedia.org/wiki/Salt_(cryptography)。

+0

返事に感謝を..ハッシュを使用してoption..Toは、お客様の作成のようです、私は、ユーザのパスワード入力をハッシュする必要がcustomer.setPassword(hashedpass)を呼び出した後、呼び出しになると思いますcustomerDoにsaveUpdate()を実行して、ハッシュがCustomerテーブルに書き込まれるようにします。検証するために、私はユーザー入力をハッシュし、dbからハッシュ・パスを取得し、一致させる必要があります。これは正しいですか? – markjason72

+0

はい、そうです。本当に安全なストレージが必要な場合は、パスワードをハッシュする前に塩をかける。 –

0

通常パスワードはデータベース内で暗号化し、あなたはそれが一致するかどうかを確認するために、入力されたパスワードを暗号化する必要が保存されます。 encrypt

String passwordEncrypted = encrypt(password); 

は、パスワードを(あなたがたとえば、MD5やSHA-1を試すことができます)陰窩あなたの関数です。

あなたがオブジェクトcustを取得した後は、プレーンテキストのパスワードを格納することは良いアイデアになることはありません

if (cust.getPassword().equals(passwordEncrypted)) { 
    // login successfull code 
} else { 
    // login failed code 
} 
+1

ハッシュ(またはメッセージダイジェスト)は暗号化ではありません。暗号化には鍵が必要です。このキーで暗号化されたデータを復号化することができます。ハッシュをハッシュすることはできません。 –

+1

パスワードをソルトしないでハッシュすると、辞書攻撃に脆弱になります。 –

+0

良い返信です!私は間違った言葉を使いました。 – GAS

5

場合、あなたは確認することができます。実際には、Top 25 Most Dangerous Software Errorsに#8の脅威としてリストされています。

パスワードをデータベースに書き込む前に暗号化する必要があります。ユーザーを検索する場合

暗号化されたパスワードを使用し
String email = req.getParameter("emailAddress"); 
String password = req.getParameter("password"); 
String encryptedPassword = MD5Helper.hashPassword(password) 
Customer cust = dao.findByEmailAddressAndPassword(email, encryptedPassword); 

あなたはMD5アルゴリズムを使用してパスワードを暗号化するために、このようなものを使用することができます。

public class MD5Helper { 

    private static final int MD5_PASSWORD_LENGTH = 16; 

    public static String hashPassword(String password) { 
     String hashword = null; 
     try { 
      MessageDigest md5 = MessageDigest.getInstance("MD5"); 
      md5.update(password.getBytes()); 
      BigInteger hash = new BigInteger(1, md5.digest()); 
      hashword = hash.toString(MD5_PASSWORD_LENGTH); 
     } catch (NoSuchAlgorithmException nsae) { 
      // handle exception 
     } 
     return hashword; 
    } 
} 
+1

ハッシュ(またはメッセージダイジェスト)は暗号化ではありません。暗号化には鍵が必要です。このキーで暗号化されたデータを復号化することができます。ハッシュをハッシュすることはできません。 –

+1

パスワードを盗むことなくパスワードをハッシュすると、辞書攻撃に脆弱になります。 –

関連する問題