2016-05-22 4 views
0

Я пытался использовать scrypt в asp.net для хэширования паролей от пользователей в базе данных после регистрации, но когда я пытаюсь войти в систему, я не знаю точно, как сравнить пароль для пользователя с хэшем из базы данных.Как сравнить пароль с хешированным паролем с помощью Scrypt.NET?

Может ли кто-нибудь помочь мне разобраться, как сравнить пароль с хешированным паролем?

Для Регистраций я использовал:

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

Я использую пакет Scrypt.NET в VS2012 с функциями: Генерация нового хеша для пароля: ScryptEncoder encoder = новый ScryptEncoder(); string hashsedPassword = encoder.Encode ("mypassword"); Сравнение пароля с хешированным паролем: ScryptEncoder encoder = новый ScryptEncoder(); bool areEquals = encoder.Compare ("mypassword", hashedPassword); Но я не знаю, как интегрировать часть с «сравнением» в моем коде в SIGN-IN. –

ответ

0

Scrypt.NET обрабатывает сравнение набранных в пароле и существующий хэш для вас. На странице документации показывает:

ScryptEncoder encoder = new ScryptEncoder(); 

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

В вашем случае это означает, что вы не можете использовать пароль в запросе SQL для получения конкретного пользователя. Вам нужно будет использовать только данные Username, чтобы найти правильную строку в таблице 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

Он показывает мне 2 ошибки в «if (encoder.Compare (Password.Text, row [" Password "])): 1. Наилучшее перегруженное соответствие метода для 'Scrypt.ScryptEncoder.Compare (string, string)' имеет некоторые неверные аргументы. Аргумент 2: невозможно преобразовать из 'объекта' в 'string'. –

+0

Здесь должно быть достаточно каста для строки. –