2016-05-22 9 views
0

サインアップ後、データベースのユーザーからのパスワードをハッシュするためにasp.netでscryptを使用しようとしていましたが、ログインしようとすると、ユーザーのパスワードとハッシュデータベースから。パスワードをハッシュされたパスワードとScrypt.NETで比較するには?

パスワードをハッシュパスワードと比較する方法を教えてもらえますか?私が使用しSIGN-UPのために

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data.SqlClient; 
using System.Configuration; 
using System.Drawing; 
using System.Security.Cryptography; 
using Scrypt; 

namespace WebApplication1 
{ 
    public partial class SignUp : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 


     } 



     protected void btSignup_Click(object sender, EventArgs e) 
     { 
      if (tbUname.Text != "" & tbPass.Text != "" && tbName.Text != "" && tbEmail.Text != "" && tbCPass.Text != "") 
      { 
       if (tbPass.Text == tbCPass.Text) 
       { 
        String CS = ConfigurationManager.ConnectionStrings["MyDatabaseConnectionString1"].ConnectionString; 
        using (SqlConnection con = new SqlConnection(CS)) 
        { 
         ScryptEncoder encoder = new ScryptEncoder(); 
         string hashsedPassword = encoder.Encode(tbPass.Text); 
         SqlCommand cmd = new SqlCommand("insert into Users values('" + tbUname.Text + "','" + hashsedPassword + "','" + tbEmail.Text + "','" + tbName.Text + "')", con); 
         con.Open(); 
         cmd.ExecuteNonQuery(); 

         lblMsg.Text = "Registration Succesfull"; 
         lblMsg.ForeColor = Color.Green; 
         Response.Redirect("~/SignIn.aspx"); 
        } 
       } 
       else { lblMsg.Text = "Passwords do not match"; } 
      } 

      else 
      { 
       lblMsg.ForeColor = Color.Red; 
       lblMsg.Text = "All Fields are Mandatory"; 

      } 
     } 

     protected void Button1_Click(object sender, EventArgs e) 
     { 

      SqlConnection con1 = new SqlConnection(); 
      con1.ConnectionString = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Integrated Security=True"; 
      con1.Open(); 
      SqlCommand cm1 = new SqlCommand(); 
      cm1.CommandText = "select * from [Users]where [email protected]"; 
      cm1.Parameters.AddWithValue("@Uname", tbUname.Text); 
      cm1.Connection = con1; 
      SqlDataReader rd = cm1.ExecuteReader(); 
      if (rd.HasRows) 
      { 
       Label1.Visible = true; 
       Label1.Text = "Username already exists !"; 
       Label1.ForeColor = System.Drawing.Color.Red; 
      } 

      else 
      { 
       Label1.Visible = true; 
       Label1.Text = "Username is available !"; 
       Label1.ForeColor = System.Drawing.Color.Green; 
      } 
     } 
    } 
} 

とログイン:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data.SqlClient; 
using System.Configuration; 
using System.Data; 

namespace WebApplication1 
{ 
    public partial class SignIn : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 


     protected void Button1_Click(object sender, EventArgs e) 
     { 
      String CS = ConfigurationManager.ConnectionStrings["MyDatabaseConnectionString1"].ConnectionString; 
      using (SqlConnection con = new SqlConnection(CS)) { 
       SqlCommand cmd= new SqlCommand("select * from Users where Username='"+ Username.Text+"' and Password='"+Password.Text+"'" , con); 
       con.Open(); 
       SqlDataAdapter sda = new SqlDataAdapter(cmd); 
       DataTable dt = new DataTable(); 
       sda.Fill(dt); 
       if (dt.Rows.Count != 0) 
       { 
        Session["USERNAME "] = Username.Text; 
        Response.Redirect("~/UserHome.aspx"); } 
       else { 
        lblError.Text = "Invalid Username or Password !"; 

       } 
      } 
     } 
    } 
} 
+0

サインアップ:http://pastebin.com/CQnjUZZd –

+0

サインイン:http://pastebin.com/aAJ9GUVQ –

+0

VS2012のScrypt.NETパッケージは、次の機能を使用しています。新しいハッシュを生成するパスワードの場合: ScryptEncoderエンコーダ=新しいScryptEncoder(); 文字列hashsedPassword = encoder.Encode( "mypassword"); ハッシュされたパスワードとパスワードの比較: ScryptEncoder encoder = new ScryptEncoder(); bool areEquals = encoder.Compare( "mypassword"、hashedPassword);しかし、SIGN-INでは、コードを「比較」する方法をパートに統合する方法はわかりません。 –

答えて

0

Scrypt.NETはパスワードで入力して、あなたのための既存のハッシュの比較を処理します。ドキュメントページには、次の情報が表示されます。

ScryptEncoder encoder = new ScryptEncoder(); 

bool areEquals = encoder.Compare("mypassword", hashedPassword); 

この場合、SQLクエリでパスワードを使用して特定のユーザーを取得することはできません。 のみを使用してUsersテーブルの正しい行を検索する必要があります。

SqlCommand cmd = new SqlCommand("select * from Users where [email protected]" , con); 
cmd.Parameters.Add("@Username", SqlDbType.NVarChar, 255, Username.Text); 

con.Open(); 
SqlDataAdapter sda = new SqlDataAdapter(cmd); 
DataTable dt = new DataTable(); 
sda.Fill(dt); 
if (dt.Rows.Count != 0) { 
    ScryptEncoder encoder = new ScryptEncoder(); 

    foreach(DataRow row in dt.Rows) 
    { 
     if (encoder.Compare(Password.Text, (string)row["Password"])) 
     { 
      Session["USERNAME "] = Username.Text; 
      Response.Redirect("~/UserHome.aspx"); 
      return; 
     } 
    } 
} else { 
    lblError.Text = "Invalid Username or Password !"; 
} 

常にパラメータ化されたSQLクエリを使用します。それ以外の場合は、SQLインジェクション攻撃が可能です。

+0

DataTableにアクセスするためのこのコードが正しいかどうかはわかりません。エラーが表示された場合は、修正してください。 –

+0

これは、 "if(encoder.Compare(Password.Text、row [" Password "]))"で2つのエラーが表示されます:1. 'Scrypt.ScryptEncoder.Compare(string、string)'に最適なオーバーロードされたメソッドがいくつかあります無効な引数。引数2: 'オブジェクト'から '文字列'に変換できません –

+0

文字列へのキャストはここで十分です。 –

関連する問題