2016-01-05 107 views
-6

我試圖拉從表中加密的密碼,但我接收此錯誤:Asp.net密碼加密和解密用的鹽

System.Data.SqlClient.SqlException:轉換轉換爲nvarchar值「84p37U29dna08XhUdV失敗時+ bhQ =='爲數據類型int。

其中值是我的加密密碼。我不明白爲什麼會有這個錯誤。該代碼在以下行中斷:dataAdapter.Fill(dataSet);

protected bool attemptLogin(String username, String password) 
    { 
     bool validLogin = false; 

     String sql = "SELECT Users.username, Passwords.password " + 
        "FROM Users INNER JOIN Passwords ON Users.userID = Passwords.password " + 
        "WHERE Users.username = @username"; 
     SqlCommand command = new SqlCommand(sql, dbConnection); 
     command.Parameters.AddWithValue("@username", username); 

     SqlDataAdapter dataAdapter = new SqlDataAdapter(command); 

     // Set of Tables (in this instance, just one) 
     DataSet dataSet = new DataSet(); 
     dataAdapter.Fill(dataSet); 
     // First Table in DataSet 
     DataTable table = dataSet.Tables[0]; 

     // Get value of password (should be in encrypted form) 
     String dbPassword = table.Rows[0]["password"].ToString(); 

     // Decrypt password 
     String decryptedPassword = decryptText("", dbPassword); 
     if (decryptedPassword.Equals(password)) 
     { 
      validLogin = true; 
     } 

     return validLogin; 
    } 
+9

忽略你遇到的錯誤,你的技術從根本上是有缺陷的。你不要解密密碼!你存儲一個鹽漬散列,添加鹽並散列給定的密碼並與存儲的值進行比較。 –

+0

@MitchWheat然而,你不需要存儲一個鹽漬的散列。我使用Buffer.BlockCopy和BitConverter的組合以及安全的散列/鹽生成器來存儲密碼的散列,實際上它是散列的散列。 –

+1

@cFrozenDeath只要所有的信息都存儲在一個單獨的字段中,你就再次容易受到醃製目標要解決的攻擊(即彩虹表)的攻擊。 – Rob

回答

4

INNER JOIN Passwords ON Users.userID = Passwords.password

你試圖加入用戶ID(int)以密碼(NVARCHAR)。