(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; } } }