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