簡體   English   中英

使用SHA1加密Sql Server 2008上的密碼

[英]Encrypt passwords on Sql Server 2008 using SHA1

我設計了一個使用C#的登錄系統,其中在加載主頁之前在SQL Server 2008中檢查了用戶名和密碼。 我希望對數據庫中存儲的密碼進行加密。 是否可以使用C#和SHA1算法來做到這一點?

以下是我的存儲過程:

ALTER procedure [dbo].[proc_UserLogin]
 @userid varchar(20),
  @password nvarchar(50)
  As 

  declare
  @ReturnVal              varchar(500)


SET NOCOUNT ON      

  if exists(select userid,password from LoginManager where userid=@userid and password=@password)
  set @ReturnVal='0|Logged in Successfully'
  else
  set @ReturnVal='1|Login Failed/Username does not exist'

  select @ReturnVal

C#代碼

public void button1_Click(object sender, EventArgs e)
        {
            mainform = new Form1();
            string[] v;

            OleDbConnection conn = new OleDbConnection("File Name=E:\\Vivek\\License Manager\\License Manager\\login.udl");

            try
            {

                conn.Open();
                string query = "EXEC dbo.proc_UserLogin'" + username.Text+ "', '" + password.Text+"'";
                OleDbCommand cmd = new OleDbCommand(query, conn);
                string s = Convert.ToString(cmd.ExecuteScalar());
                v= s.Split('|');
                if (v[0]=="0")
                {
                    mainform.Show();
                    this.Hide();
                }
                else
                {
                    MessageBox.Show("Please enter correct user credentials and try again");
                }


             }

             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
             }


              conn.Close();

         }

我曾經在這里經歷過其他用戶提出的類似問題,但他們沒有為我工作。 誰能建議對代碼進行更改,以便可以完成密碼加密?

謝謝

C#中的哈希和鹽密碼

https://crackstation.net/hashing-security.htm

https://www.bentasker.co.uk/blog/security/201-why-you-should-be-asking-how-your-passwords-are-stored

正如我在評論中所述,哈希密碼是您不應該自己做的事情。

注意事項:

  • 不建議使用SHA1作為密碼
  • 密碼應該撒鹽
  • 您應該使用經過驗證的用戶存儲框架,而不要嘗試創建自己的框架,因為您可能會“做錯了”
  • 我敢肯定還有更多

話雖如此 ,要完成您的特定問題,您需要這樣的東西:

Users
----
userId
passwordHashed

passwordHashed存儲用戶密碼的哈希版本(明文密碼永遠不會存儲在持久性位置)。

為了檢查有效的密碼,請執行以下操作:

ALTER procedure [dbo].[proc_UserLogin]
 @userid varchar(20),
  @password nvarchar(50)
  As 

  declare
  @ReturnVal              varchar(500)


SET NOCOUNT ON      

  if exists(select userid,password from LoginManager where userid=@userid and password=HASHBYTES('SHA1', @password))
  set @ReturnVal='0|Logged in Successfully'
  else
  set @ReturnVal='1|Login Failed/Username does not exist'

  select @ReturnVal

對於插入/更新用戶密碼,您需要確保存儲散列密碼而不是純文本密碼。

INSERT INTO users(userId, passwordHashed) 
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)

要么

UPDATE users 
SET passwordHased = HASHBYTES('SHA1', @rawPassword) 
WHERE userId = @userId

編輯:

剛意識到您在問如何在C#中完成散列,而不是SQL。 您可以執行以下操作(取自C#中的SHA1算法的哈希處理 ):

public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(temp);
        return Convert.ToBase64String(hash);
    }
}

您的代碼片段可能是:

            conn.Open();
            string query = "EXEC dbo.proc_UserLogin'" + username.Text+ "', '" + this.Hash(System.Text.Encoding.UTF8.GetBytes(password.Text))+"'";
            OleDbCommand cmd = new OleDbCommand(query, conn);

您還應該注意,應該將參數設置為存儲過程的參數,而不是按照原樣傳遞參數-看起來您已經對此有單獨的疑問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM