簡體   English   中英

如何驗證存儲在數據庫中的密碼作為哈希值?

[英]how to verify password which is store in database as a hash value?

我想以加密形式存儲密碼。 我用過sha256。 我的代碼如下

public static string ComputeHash(string plainText)
    {
        int minSaltSize = 4;
        int maxSaltSize = 8;

        Random random = new Random();
        int saltSize = random.Next(minSaltSize, maxSaltSize);

        byte[] saltBytes = new byte[saltSize];
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
        rng.GetNonZeroBytes(saltBytes);

        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
        byte[] plainTextWithSaltBytes = new byte[plainTextBytes.Length + saltBytes.Length];

        for (int i = 0; i < plainTextBytes.Length; i++)
            plainTextWithSaltBytes[i] = plainTextBytes[i];

        for (int i = 0; i < saltBytes.Length; i++)
            plainTextWithSaltBytes[plainTextBytes.Length + i] = saltBytes[i];


        HashAlgorithm hash = new SHA256Managed();
        byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes);
        byte[] hashWithSaltBytes = new byte[hashBytes.Length + saltBytes.Length];

        for (int i = 0; i < hashBytes.Length; i++)
            hashWithSaltBytes[i] = hashBytes[i];

        for (int i = 0; i < saltBytes.Length; i++)
            hashWithSaltBytes[hashBytes.Length + i] = saltBytes[i];

        string hashValue = Convert.ToBase64String(hashWithSaltBytes);
        return hashValue;
    }

現在當用戶登錄時我想驗證這個密碼我該怎么做?

從用戶獲取純文本密碼,使用相同的算法對其進行散列,並將新生成的散列與數據庫中存儲的散列進行比較。 如果兩個哈希值相同,則用戶輸入正確的密碼。

更新

你每次使用一種新鮮隨機的鹽,通往不同的哈希。 只需在數據庫中創建一個包含所用鹽的新列,然后選擇此列。

將salt與哈希一起保存不是安全問題 如果直接使用鹽,鹽將僅禁止對單個散列算法使用預先計算的彩虹表。 它沒有提供任何關於使用的真實密碼的線索,也沒有提供關於如何將鹽與純文本密碼(前置,附加,交織,...)結合的線索,因此可以安全地存儲下一個到生成的哈希。

暫無
暫無

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

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