在 ASP.NET 中散列密码并在 SQL 过程中解析它
Hashing Password in ASP.NET and Resolving it In SQL Procedure
我正在使用 SQL 服务器存储过程开发 ASP.NET 应用程序。我需要散列我的登录密码并在我的 sp_LoginCheck 存储过程中解析它。
有什么建议吗?
我已经在数据库中插入了数据。
例如:
UserName/Password
ABC/123456
DEF/987654
我想加密或哈希任何密码,然后在存储过程中解密它并查询 table 以便我可以获得数据。
一个非常简单的方法是使用 MD5 哈希。
public class MD5
{
public static string Hash(string message)
{
// step 1, calculate MD5 hash from input
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(message);
byte[] hash = md5.ComputeHash(inputBytes);
// step 2, convert byte array to hex string
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
sb.Append(hash[i].ToString("X2"));
}
return sb.ToString().ToUpper();
}
}
然后在你的申请中
你说
var password = MD5.hash(passwordField);
并将其存储在数据库中。
验证密码时,您只需说
db.Account.Where(w => w.email == emailField && w.password == MD5.hash(passwordField)
查看您是否有匹配的记录。
正如@zulq 所说,有更好的系统,有些东西有盐等,但是对于您要求的基本密码散列,这将起作用。
但是,如果您希望在存储过程中执行所有这些操作。您可以在 SQL
中使用以下 HASHBYTES 函数
HASHBYTES('md5', 'your password')
调用存储过程时同样如此,您将其散列并存储的纯文本密码传递给它
验证时,您向存储过程传递它验证的用户名/密码和 returns true 或 false 或一行。
我认为你需要更具体地说明你到底想要什么。但是下面有一个完整的答案。存储过程:
USE [YourDB]
GO
CREATE PROCEDURE [dbo].[sp_LoginCheck] @UserID varchar(25), @password varchar(25)
AS
SELECT username, user_password FROM UserPassword
WHERE username = @UserID and user_password=@password
GO
VB代码:
Public Function validateUser(username As String, password As String) as Boolean
Using sqlCon = new SqlConnection(yourConStr)
Dim cmd = new SqlCommand("sp_LoginCheck",sqlCon)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@UserID",username)
cmd.Parameters.AddWithValue("@password",GetMd5Hash(password))
sqlCon.Open()
Dim dr As SqlDataReader = cmd.ExecuteReader()
If dr.Read() Then
Return True
Else
Return False
End Using
End Function
请注意,您应该将代码附在 try catch 中并进行密码哈希处理。您应该存储散列密码,并在将散列密码与数据库进行比较时进行比较。散列参考其他答案。
为方便起见,直接来自 MSDN 并稍作修改:
Shared Function GetMd5Hash(ByVal input As String) As String
Dim md5Hash As MD5 = MD5.Create()
Dim data As Byte() = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input))
Dim sBuilder As New StringBuilder()
Dim i As Integer
For i = 0 To data.Length - 1
sBuilder.Append(data(i).ToString("x2"))
Next i
Return sBuilder.ToString()
End Function
我正在使用 SQL 服务器存储过程开发 ASP.NET 应用程序。我需要散列我的登录密码并在我的 sp_LoginCheck 存储过程中解析它。
有什么建议吗?
我已经在数据库中插入了数据。
例如:
UserName/Password
ABC/123456
DEF/987654
我想加密或哈希任何密码,然后在存储过程中解密它并查询 table 以便我可以获得数据。
一个非常简单的方法是使用 MD5 哈希。
public class MD5
{
public static string Hash(string message)
{
// step 1, calculate MD5 hash from input
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(message);
byte[] hash = md5.ComputeHash(inputBytes);
// step 2, convert byte array to hex string
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
sb.Append(hash[i].ToString("X2"));
}
return sb.ToString().ToUpper();
}
}
然后在你的申请中
你说
var password = MD5.hash(passwordField);
并将其存储在数据库中。
验证密码时,您只需说
db.Account.Where(w => w.email == emailField && w.password == MD5.hash(passwordField)
查看您是否有匹配的记录。
正如@zulq 所说,有更好的系统,有些东西有盐等,但是对于您要求的基本密码散列,这将起作用。
但是,如果您希望在存储过程中执行所有这些操作。您可以在 SQL
中使用以下 HASHBYTES 函数HASHBYTES('md5', 'your password')
调用存储过程时同样如此,您将其散列并存储的纯文本密码传递给它
验证时,您向存储过程传递它验证的用户名/密码和 returns true 或 false 或一行。
我认为你需要更具体地说明你到底想要什么。但是下面有一个完整的答案。存储过程:
USE [YourDB]
GO
CREATE PROCEDURE [dbo].[sp_LoginCheck] @UserID varchar(25), @password varchar(25)
AS
SELECT username, user_password FROM UserPassword
WHERE username = @UserID and user_password=@password
GO
VB代码:
Public Function validateUser(username As String, password As String) as Boolean
Using sqlCon = new SqlConnection(yourConStr)
Dim cmd = new SqlCommand("sp_LoginCheck",sqlCon)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@UserID",username)
cmd.Parameters.AddWithValue("@password",GetMd5Hash(password))
sqlCon.Open()
Dim dr As SqlDataReader = cmd.ExecuteReader()
If dr.Read() Then
Return True
Else
Return False
End Using
End Function
请注意,您应该将代码附在 try catch 中并进行密码哈希处理。您应该存储散列密码,并在将散列密码与数据库进行比较时进行比较。散列参考其他答案。
为方便起见,直接来自 MSDN 并稍作修改:
Shared Function GetMd5Hash(ByVal input As String) As String
Dim md5Hash As MD5 = MD5.Create()
Dim data As Byte() = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input))
Dim sBuilder As New StringBuilder()
Dim i As Integer
For i = 0 To data.Length - 1
sBuilder.Append(data(i).ToString("x2"))
Next i
Return sBuilder.ToString()
End Function