ASP.NET中的密码散列和SQL过程中的密码解析

ASP.NET中的密码散列和SQL过程中的密码解析,asp.net,vb.net,stored-procedures,hash,password-protection,Asp.net,Vb.net,Stored Procedures,Hash,Password Protection,我正在使用SQL Server存储过程开发一个ASP.NET应用程序。我需要散列我的登录密码,并在sp_LoginCheck存储过程中解析它 有什么建议吗 我已经在数据库中插入了数据 例如: UserName/Password ABC/123456 DEF/987654 我想对密码进行加密或散列,然后在存储过程中解密密码并查询表,以便获取数据。一个非常简单的方法是使用MD5散列 public class MD5 { public static string Hash(string

我正在使用SQL Server存储过程开发一个ASP.NET应用程序。我需要散列我的登录密码,并在sp_LoginCheck存储过程中解析它

有什么建议吗

我已经在数据库中插入了数据

例如:

UserName/Password

ABC/123456

DEF/987654

我想对密码进行加密或散列,然后在存储过程中解密密码并查询表,以便获取数据。

一个非常简单的方法是使用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();
    }
}
并将其存储在数据库中

当验证密码时,您只需说出以下内容

db.Account.Where(w => w.email == emailField && w.password == MD5.hash(passwordField)
查看您是否有匹配的记录

正如@zulq所说的,有更好的系统,比如说有salt等,但是对于您要求的基本密码散列,这将起作用

但是,如果您希望在存储过程中执行所有这些操作。您可以在SQL中使用以下HASHBYTES函数

HASHBYTES('md5', 'your password')
同样,在调用存储过程时,传递它散列并存储的纯文本密码


验证时,向存储过程传递用户名/密码,它将验证并返回true或false或一行。

一个非常简单的方法是使用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();
    }
}
并将其存储在数据库中

当验证密码时,您只需说出以下内容

db.Account.Where(w => w.email == emailField && w.password == MD5.hash(passwordField)
查看您是否有匹配的记录

正如@zulq所说的,有更好的系统,比如说有salt等,但是对于您要求的基本密码散列,这将起作用

但是,如果您希望在存储过程中执行所有这些操作。您可以在SQL中使用以下HASHBYTES函数

HASHBYTES('md5', 'your password')
同样,在调用存储过程时,传递它散列并存储的纯文本密码


验证时,向存储过程传递用户名/密码,它将验证并返回true或false或一行。

一个非常简单的方法是使用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();
    }
}
并将其存储在数据库中

当验证密码时,您只需说出以下内容

db.Account.Where(w => w.email == emailField && w.password == MD5.hash(passwordField)
查看您是否有匹配的记录

正如@zulq所说的,有更好的系统,比如说有salt等,但是对于您要求的基本密码散列,这将起作用

但是,如果您希望在存储过程中执行所有这些操作。您可以在SQL中使用以下HASHBYTES函数

HASHBYTES('md5', 'your password')
同样,在调用存储过程时,传递它散列并存储的纯文本密码


验证时,向存储过程传递用户名/密码,它将验证并返回true或false或一行。

一个非常简单的方法是使用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();
    }
}
并将其存储在数据库中

当验证密码时,您只需说出以下内容

db.Account.Where(w => w.email == emailField && w.password == MD5.hash(passwordField)
查看您是否有匹配的记录

正如@zulq所说的,有更好的系统,比如说有salt等,但是对于您要求的基本密码散列,这将起作用

但是,如果您希望在存储过程中执行所有这些操作。您可以在SQL中使用以下HASHBYTES函数

HASHBYTES('md5', 'your password')
同样,在调用存储过程时,传递它散列并存储的纯文本密码


验证时,向存储过程传递用户名/密码,它将验证并返回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 

我认为你需要更具体地说明你到底想要什么。然而,下面有一个完整的答案。存储过程:

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 

我认为你需要更具体地说明你到底想要什么。然而,下面有一个完整的答案。存储过程:

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 

我认为你需要更具体地说明你到底想要什么。然而,下面有一个完整的答案。存储过程:

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 

请参阅此处的此链接,但也可以阅读其他安全措施,如添加密码。谢谢您的回答,但我看不到有关在存储过程中解析密码的任何内容?定义“解析”-这是什么意思。如何解决?为什么需要解密密码?哈希只是向前的。如果数据库中有普通密码,那么可以在比较之前对数据库中的密码应用哈希。另一种解决方案是使用util对数据库中的所有密码进行加密,这是出于安全原因的最佳选择。请参阅此处的此链接,但也请阅读其他安全措施,如添加密码。感谢您的回答,但我看不到有关在存储过程中解析密码的任何内容?定义“解析”-你这是什么意思。如何解决?为什么需要解密密码?哈希只是向前的。如果数据库中有普通密码,那么可以在比较之前对数据库中的密码应用哈希。另一种解决方案是使用util t