2013-01-01 149 views
2

我目前正在研究Visual Studio C#窗體項目。然而,我對SHA256 +鹽漬工程的感受很困惑。我在網上找到了一些示例,但無法理解如何調用此函數。如何創建一個SHA256哈希鹽?

我想以連接到數據庫的登錄表單(Microsoft Access 2010)調用此函數。

  • 如何通過一個按鈕的點擊來自Textbox閱讀 密碼調用這個函數?
  • 我如何顯示散列值在 Messagebox.Show方法? (爲了我的測試目的)
  • 是否可以通過 比較兩個文本(散列和醃製)並給出肯定的結果?

    public static string sha256encrypt(string phrase, string UserName) 
    { 
        string salt = CreateSalt(UserName); 
        string saltAndPwd = String.Concat(phrase, salt); 
        UTF8Encoding encoder = new UTF8Encoding(); 
        SHA256Managed sha256hasher = new SHA256Managed(); 
        byte[] hashedDataBytes =  sha256hasher.ComputeHash(encoder.GetBytes(saltAndPwd)); 
        string hashedPwd = String.Concat(byteArrayToString(hashedDataBytes), salt); 
        return hashedPwd; 
    } 
    
    public static string byteArrayToString(byte[] inputArray) 
    { 
        StringBuilder output = new StringBuilder(""); 
        for (int i = 0; i < inputArray.Length; i++) 
        { 
         output.Append(inputArray[i].ToString("X2")); 
        } 
        return output.ToString(); 
    } 
    
    private static string CreateSalt(string UserName) 
    { 
        string username = UserName; 
        byte[] userBytes; 
        string salt; 
        userBytes = ASCIIEncoding.ASCII.GetBytes(username); 
        long XORED = 0x00; 
    
        foreach (int x in userBytes) 
         XORED = XORED^x; 
    
        Random rand = new Random(Convert.ToInt32(XORED)); 
        salt = rand.Next().ToString(); 
        salt += rand.Next().ToString(); 
        salt += rand.Next().ToString(); 
        salt += rand.Next().ToString(); 
        return salt; 
    } 
    

如何創建與鹽的SHA256哈希?

shavalue = (sha256encrypt("password", "username"); 
saltedandhashtext = CreateSalt(shavalue); 
+4

我不知道如果我相信這段代碼沒有閱讀*和理解*它,因爲它調用SHA-256「加密」,只有使用多達256個不同的鹽值... –

+4

我不會浪費任何時間讓這些代碼工作。扔出去,並從新的代碼開始。特別是使用'Rfc2898DeriveBytes',它使用拉伸散列函數,並且可以自己創建一個鹽。 – CodesInChaos

+2

由於您在哈希密碼,因此您應該考慮在CSharp中使用像PBKDF2這樣的慢密鑰派生函數,它可以使用[Rfc2898DeriveBytes](http://msdn.microsoft.com/zh-cn/library/system .security.cryptography.rfc2898derivebytes%28v = vs.100%29)class,正如CodesInChaos已經提到的那樣。 – martinstoeckli

回答

2

對於第一個問題,看看CC公司的回答。

到第二點: MessageBox.Show(sha256encrypt(textBox1.Text, "SampleUserName"));

3)是,它是。

您可以比較兩個字符串與==比較器或string.Equals()

public bool compareHashs(string hash1, string hash2){ 
    if(hash1.Equals(hash2) //or hash1 == hash2 
     return true; 
    }else{ 
     return false; 
    } 
} 
4

你會做什麼,就按一下按鈕,通過文本框的值和用戶名的sha256encrypt功能,例如:

private void button1_Click(object sender, EventArgs e) 
    { 
     sha256encrypt(textBox1.Text, "SampleUserName"); 
    } 

對於第二個問題,做相同的,但與Messagebox.Show:

private void button1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show(sha256encrypt(textBox1.Text, "SampleUserName")); 
    } 

第三點:我不知道你的意思到底是什麼,但如果你想鹽文本,並與散列文本比較:

if(sha256encrypt("password", "username") == CreateSalt("password")) 
    return true; 
else 
    return false; 

或者,如果你想手動進行比較:

MessageBox.Show(sha256encrypt("password", "username") + "\n\r" + CreateSalt("password")); 
+0

@JanesAbouChleih你是否想要發表實際的問題? –

+0

那麼,如果大衛在發佈我的答案後沒有編輯他的帖子... –