在 C# 中验证 SHA512 哈希密码

Verify SHA512 Hashed Password in C#

我用 C# 设计了一个注册页面,所有用户都必须输入他们的密码,然后程序会在使用 SHA512 哈希方法将密码保存到数据库之前对其进行哈希处理。

现在,我想用数据库中保存的密码验证登录页面上输入的密码。

下面的代码是我用来散列密码的方法。

现在如何验证在登录页面输入的密码???

byte[] infos = System.Text.Encoding.ASCII.GetBytes(txtPassword.Text);
infos = new System.Security.Cryptography.SHA512Managed().ComputeHash(infos);
String hash = System.Text.Encoding.ASCII.GetString(infos);

写这样的代码怎么样:

using System;
using System.Text;
using System.Security.Cryptography;
using CodeShare.Cryptography;

namespace CodeShare.Cryptography
{
    public static class SHA
    {

        public static string GenerateSHA512String(string inputString)
        {
            SHA512 sha512 = SHA512Managed.Create();
            byte[] bytes = Encoding.UTF8.GetBytes(inputString);
            byte[] hash = sha512.ComputeHash(bytes);
            return GetStringFromHash(hash);
        }

        private static string GetStringFromHash(byte[] hash)
        {
            StringBuilder result = new StringBuilder();
            for (int i = 0; i < hash.Length; i++)
            {
                result.Append(hash[i].ToString("X2"));
            }
            return result.ToString();
        }

    }
}

示例:

public void UsageExample()
  {

    Console.WriteLine(SHA.GenerateSHA512String("abc"));
    //returns DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F
  }

Sha* 哈希系列不适合安全地存储密码,因为它们速度太快而且 brute-forced 太容易了。您应该切换到专用的 password-hash 函数,例如 BCrypt、Argon2 或 PBKDF2,它们应用盐并使用 key-stretching.

通过 Nuget 可以获得一个很好的 BCrypt 库:https://www.nuget.org/packages/BCrypt.Net-Next/

它的用法非常直接:

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
string hashToStoreInDb = BCrypt.HashPassword(password);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from existingHashFromDb.
bool isPasswordCorrect = BCrypt.Verify(password, existingHashFromDb);