2017-08-16 38 views
0

データベースにユーザーのパスワードを格納する必要があるASP.NETプログラムを作成しています。しかし、データベースのパスワードとユーザー入力のパスワードを比較すると、パスワードが一致しません。ユーザーのパスワードが正しい場合でも。ASP.NET MVCのパスワードを比較して比較する方法

パスワードハッシュ:

string PasswordSalt = Crypto.HashPassword(DateTime.Now.ToString()); 
string hashPassword = Crypto.HashPassword(formcollection["PassWord"]); //Hash User PassWord 
user.PassWord = Crypto.HashPassword(PasswordSalt + hashPassword);//Add Salt to Password For Futher Security 
user.PassWordSalt = PasswordSalt; 

パスワード検証:

Users ThisUser = Users.UsersGetByEmail((string)Session["email"]); 
string checkpassword = ThisUser.PassWord; 

//User Inputed password. 
string password = user.PassWord; 

if (password != null) 
{ 
    //Need to fix. 
    string encrypt_password = Crypto.HashPassword(password); 
    string salted_password = Crypto.HashPassword(ThisUser.PassWordSalt + encrypt_password); 
    //bool does_password_match = Crypto.VerifyHashedPassword(checkpassword, password); 
    if (checkpassword == salted_password) 
    { 
     //Check if the inputed password matches the password from the Database. 

     //Remember to give session based on the user_id. 
     Session["user_id"] = ThisUser.Id; 
     return RedirectToAction("Promise"); 


    } 
    else 
    { 

     ModelState.AddModelError("PassWord", "Wrong Password, Please Enter Correct Password"); 
     return View(user); 
    } 
+0

あなたはasp IDを使用して調べましたか?これらのすべてが、多くの組み込みメソッドであなたの世話をしています –

+1

セキュリティに関するルール1:自分でビルドしないでください:) – oerkelens

答えて

1

私はそれを使用していないが、文書に基づいて決してきた...

Crypto.HashPasswordがために塩を追加パスワードを確認するために、すべての詳細が記載されたbase-64でエンコードされた文字列を返します。だから、自分で塩を加える必要はありません。

ハッシュ結果(base64EncodedHash以下)をDBに保存し、VerifyHashedPasswordとともに使用して後で認証するだけです。例えば。 (コメントは私が見る癖のために追加)

user.PassWord = Crypto.HashPassword(formcollection["PassWord"]); 

次に確認するために:あなたのコードにこれを翻訳する

var base64EncodedHash = Crypto.HashPassword("password"); 
Assert.IsTrue(Crypto.VerifyHashedPassword(base64EncodedHash, "password")); 
Assert.IsFalse(Crypto.VerifyHashedPassword(base64EncodedHash, "otherPass")); 

https://msdn.microsoft.com/en-us/library/system.web.helpers.crypto.verifyhashedpassword(v=vs.111).aspx

:そのようにユニットテストを行う

//Why are you storing "email" in Session before user is validated??? Seems off. 
Users ThisUser = Users.UsersGetByEmail((string)Session["email"]); 
string userInputPassword = user.PassWord; //this should be coming from POST 

if(ThisUser != null && Crypto.VerifyHashedPassword(ThisUser.PassWord, userInputPassword)) { 
    Session["user_id"] = ThisUser.Id; 
    return RedirectToAction("Promise"); 
} 
else { 
    ModelState.AddModelError("PassWord","Your username or password are incorrect"); 
    return View(user); 
} 

理想的には、あなたのエラーテキストが私の変更によって幾分示されたように...あなたはまた、ユーザー名/電子メールまたはパスワードが間違っているかどうかを示す同じエラーメッセージ。あなたのコードは、電子メールがアカウントを返さない場合でも、おそらく違うエラーを返しますが、そのような情報をブルートフォース攻撃者に与えることは望ましくありません。

あなたはまた、彼らは障害にあまりにも多くの時間をしようとすると、時間の。X量のためにそのIPアドレスをブロックするようにチェックするいくつかのブルートフォースに置く必要がある

など

そして、誰かが言ったように...セキュリティに関しては、 エキスパートまで... リスクを軽減するために、既存のコード/フレームワークを使用することをお勧めします。

+0

私はブルートフォースチェックを実装したいと思います。どのようにそれについて行くかについての任意のアイデア?答えをありがとう。 – Izuagbala

+0

@Izuagbala、ブルートフォースチェックのために、基本的に、あなたがしようとしていることは、それらを遅くして、良いパスワードが推測するのに何百年もかかるということです。クイック・グーグルはあなたに完全な説明をたくさん与えるはずです。しかし、簡単に言えば、1)DBテーブルを作成するか、IpLogAttempts {Ip、AttemptsCount、LastAttempt}をキャッシュします。 2)IPがログインしようとすると、最大失敗/時間を超えた場合にブロックします。 3)まだブロックされていない場合は、パスワードを確認し、ログインが間違っている場合は、AttemptsCountを増やしてください。 IPを5〜20分間ブロックしても、ブルートフォース攻撃が成功する可能性は劇的に減少します。 –

+0

@Izuagbala、コメントは十分に説明するスペースではないので、私は一緒に投げたより完全な説明です:http://coding.xingcr.com/securing-website-against-brute-force-attacks/ –

関連する問題