2018.5.9
2020.1.7

パスワードのハッシュ化(PasswordHasher、Bcrypt)

ASP.NET Coreでパスワードのハッシュ化をしたかったのですが、いくつか方法があるようだったので、まとめておきます。

目次

  • PasswordHasher
  • 公式ドキュメントに掲載されていたコード
  • Bcrypt
  • 最後に

PasswordHasher

Microsoft.AspNetCore.Identityに「PasswordHasher」というクラスがあるので、これを使ってハッシュ化したパスワードの取得や、ログイン時の入力チェックを行うことが可能です。


var ph = new PasswordHasher<ApplicationUser>();
var user = new ApplicationUser();
var password = "admin";

// ハッシュパスワードの取得
var hashedPassword = ph.HashPassword(user, password);

// パスワードのチェック
var result = ph.VerifyHashedPassword(user, hashedPassword, password);
if (result == PasswordVerificationResult.Success)
{
    Console.WriteLine("Success");
}

PasswordHasher<TUser> Class (Microsoft.AspNetCore.Identity) | Microsoft Docs

c# - ASP.NET Identity default Password Hasher, how does it work and is it secure? - Stack Overflow

公式ドキュメントに掲載されていたコード

ちなみに公式のドキュメントに掲載されていたコードは以下の通りです。


string password = "admin";

byte[] salt = new byte[128 / 8];
using (var rng = RandomNumberGenerator.Create())
{
    rng.GetBytes(salt);
}

string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
    password: password,
    salt: salt,
    prf: KeyDerivationPrf.HMACSHA1,
    iterationCount: 10000,
    numBytesRequested: 256 / 8));

Console.WriteLine($"Hashed: {hashed}");

ASP.NET Core でパスワードをハッシュ | Microsoft Docs

内容的に「PBKDF2」を使っているのでPasswordHasherクラスを使った場合と同じになると思うのですが、この場合、入力されたパスワードのチェックはどうするんでしょうか...

Bcrypt

ASP.NET CoreでパスワードのハッシュにBcryptを利用する場合、NuGetパッケージマネージャーで必要なパッケージをインストールしてから行います。

パッケージを検索すると幾つかヒットして、どれを使っていいのかがよく分かりませんでしたが、今回はGitHub - BcryptNet/bcrypt.net: BCrypt.Netを使って確認しています。


var password = "admin";

// ハッシュパスワードの取得
var hashedPassword = BCrypt.Net.BCrypt.HashPassword(password);

// パスワードのチェック
if (BCrypt.Net.BCrypt.Verify(hashedPassword, password))
{
    Console.WriteLine("Success");
}

.net - Hash Password in C#? Bcrypt/PBKDF2 - Stack Overflow

最後に

パスワードをハッシュ化せずに素の状態で保存するのはあり得ませんが、ハッシュ化しておいても絶対に安全ということはないようなので、セキュリティの強度やパフォーマンスを考慮してどの方式を使うか選ぶような感じです。

ASP.NET Core】関連記事