2014-10-08 59 views
2

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

以下是我的存儲過程:

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 [email protected] and [email protected]) 
    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(); 

     } 

我已經通過這裏的其他用戶問類似的問題了,但他們並沒有爲我工作。任何人都可以提出更改代碼,以便密碼加密可以完成?

感謝

+0

已經嘗試過用戶存儲和密碼散列的真正預構建方法,爲什麼試圖推出自己的?你發佈的內容不是靠近解決方案的地方,那麼你希望作爲答案? – Kritner 2014-10-08 12:14:20

+0

也加密<>哈希 – Kritner 2014-10-08 12:15:14

+0

@Kritner所以要做什麼? – user2614235 2014-10-08 12:16:10

回答

3

Hash and salt passwords in 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

正如我在註釋中規定,散列密碼是什麼,你可能不應該做自己。

有幾件事情需要注意:不建議密碼

  • 密碼應鹽漬
  • 您應該使用經過驗證的userstore框架,而不是試圖創建自己的

    • 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 [email protected] and password=HASHBYTES('SHA1', @password)) 
        set @ReturnVal='0|Logged in Successfully' 
        else 
        set @ReturnVal='1|Login Failed/Username does not exist' 
    
        select @ReturnVal 
    

    用來插入/更新用戶密碼,你需要確保存儲哈希密碼不是明文密碼,如SUC H;

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

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

    編輯:

    剛剛意識到你問如何完成散在C#中,沒有SQL。你可以執行(從Hashing with SHA1 Algorithm in C#採取)以下:

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

    你還應該注意的是,你應該參數的參數存儲過程,而不是通過他們的你的態度 - 看起來你已經有一個單獨的問題了。

  • +0

    謝謝,請試試看:) – user2614235 2014-10-09 11:48:15

    +0

    非常感謝@ Kritner.I是c#的新手。我想要的只是當用戶輸入密碼時,它應該存儲在sql server數據庫加密格式。我們的客戶沒有那麼複雜的破解密碼:) 因此,無後顧之憂 – user2614235 2014-10-09 11:56:04

    +0

    嘿Kitner我能夠加密的密碼,現在如何將比較發生即(轉換加密解密比較), – user2614235 2014-10-10 05:25:10