2016-05-22 11 views
0

Ich versuchte Scrypt in asp.net zu verwenden, um die Passwörter von Benutzern in der Datenbank nach der Anmeldung zu hashen, aber wenn ich mich anmelde, weiß ich nicht genau, wie man das Passwort für den Benutzer mit dem Hash vergleicht aus der Datenbank.Wie kann man ein Passwort mit einem Hash-Passwort mit Scrypt.NET vergleichen?

Kann mir jemand helfen, herauszufinden, wie man ein Passwort mit einem Hash-Passwort vergleicht?

Für SIGN-UP verwendet I:

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; 
      } 
     } 
    } 
} 

und Anmeldung:

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

Anmeldung: http://pastebin.com/CQnjUZZd –

+0

Anmeldung: http://pastebin.com/aAJ9GUVQ –

+0

Ich benutze das Paket Scrypt.NET, in VS2012, mit den Funktionen: Erzeugen eines neuen Hash für ein Passwort: ScryptEncoder Encoder = neuer ScryptEncoder(); Zeichenfolge hashsedPassword = encoder.Encode ("mypassword"); Vergleichen eines Passworts mit einem Hash-Passwort: ScryptEncoder encoder = new ScryptEncoder(); bool areEquals = encoder.Compare ("mypassword", hashedPassword); Aber ich weiß nicht, wie ich den Teil mit "Vergleichen" in meinen Code, in der ANMELDUNG integrieren soll. –

Antwort

0

Scrypt.NET behandelt den Vergleich der in Passwort eingegeben und die vorhandene Hash für Sie. Die Dokumentation Seite zeigt:

ScryptEncoder encoder = new ScryptEncoder(); 

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

In Ihrem Fall bedeutet das, dass Sie das Passwort nicht in der SQL-Abfrage verwenden können, einen bestimmten Benutzer zu erhalten. Sie müssten nur die angegebene Username verwenden, um die richtige Zeile in der Tabelle Users zu finden.

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 !"; 
} 

Verwenden Sie immer parametrisierte SQL-Abfragen. Andernfalls sind Sie offen für SQL-Injection-Angriffe.

+0

Ich habe keine Ahnung, ob dieser Code für den Zugriff auf die DataTable korrekt ist. Wenn Sie einen Fehler sehen, korrigieren Sie ihn bitte. –

+0

Es zeigt mir 2 Fehler bei "if (encoder.Compare (Password.Text, row [" Password "]))": 1. Die beste überladene Methodenübereinstimmung für 'Scrypt.ScryptEncoder.Compare (string, string)' hat einige ungültige Argumente. Argument 2: Konvertierung von "Objekt" in "String" nicht möglich –

+0

Casting in String sollte hier genügen. –