(C#)パスワードのハッシュ化

(C#)パスワードハッシュ化

ログインパスワードなど不可逆の文字列はハッシュを使う。

var salt = PasswordUtil.CreateSalt();
var hashedPassword = PasswordUtil.NewHashPassword(changePassword.Password, salt);
public class PasswordUtil
{
    /// <summary>
    /// ハッシュのサイズ
    /// </summary>
    private const int HashSize = 32;

    /// <summary>
    /// ソルトのサイズ
    /// </summary>
    private const int SaltSize = 32;

    /// <summary>
    /// ソルト生成時の反復回数
    /// </summary>
    private const int Iteration = 10000;

    /// <summary>
    /// DBに登録されているソルトを使ってパスワードをハッシュ化する
    /// </summary>
    /// <param name="password"></param>
    /// <returns></returns>
    public static string HashThePassword(string userId, string password, IDbConnection connection)
    {
        // ソルト取得
        var sql = SqlResource.get("Utility/GetSalt");
        var result = connection.Query<ValueModel>(sql, new { UserId = userId }).ToList();
        if (result.Count == 0)
        {
            return null;
        }
        string strSalt = (string)result[0].Value;

        // ハッシュ生成
        string strHash = NewHashPassword(password, strSalt);

        return strHash;
    }

    /// <summary>
    /// パスワードをハッシュ化する
    /// </summary>
    /// <param name="rawPassword"></param>
    /// <param name="salt"></param>
    /// <param name="size"></param>
    /// <returns></returns>
    public static string NewHashPassword(string rawPassword, string strSalt)
    {
        byte[] salt = Convert.FromBase64String(strSalt);

        using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(rawPassword, salt, Iteration))
        {
            byte[] hash = rfc2898DeriveBytes.GetBytes(HashSize);
            string strHash = Convert.ToBase64String(hash);
            return strHash;
        }
    }

    /// <summary>
    /// ランダムにソルトを作成する
    /// </summary>
    /// <param name="size"></param>
    /// <returns></returns>
    public static string CreateSalt()
    {
        using (var generator = RandomNumberGenerator.Create())
        {
            byte[] salt = new Byte[SaltSize];
            generator.GetBytes(salt);
            string strSalt = Convert.ToBase64String(salt);
            return strSalt;
        }
    }

}