//検証する //引数1:平文パスワード //引数2:PBKDF2Hashクラス public static bool Verify(string password, PBKDF2Hash hash) { if (password == null) { throw new ArgumentNullException(nameof(password)); } if (hash == null) { throw new ArgumentNullException(nameof(hash)); } using (var deriveBytes = new Rfc2898DeriveBytes(password, salt: hash.Salt, iterations: hash.Iterations)) { var dk = deriveBytes.GetBytes(DerivedKeyLength); return(hash.DerivedKey.SequenceEqual(dk)); } }
//検証する //引数1:平文パスワード //引数2:ハッシュ値 public static bool Verify(string password, string hashStr) { if (password == null) { throw new ArgumentNullException(nameof(password)); } if (hashStr == null) { throw new ArgumentNullException(nameof(hashStr)); } if (PBKDF2Hash.TryParse(hashStr, out var hash) == false) { throw new FormatException(nameof(hashStr)); } return(Verify(password, hash)); }
//文字列の形式がMCFの形式と一致しているか確認する //一致していれば、文字列をPBKDF2Hashクラスに変換して出力する //引数1:ハッシュ結果文字列 //引数2:出力。PBKDF2Hash //戻り値:形式が正しいか public static bool TryParse(string hashStr, out PBKDF2Hash result) { result = null; //入力形式チェック if (hashStr == null) { return(false); } if (hashStr.StartsWith(SPRT) == false) { return(false); } var elems = hashStr.Split(new[] { SPRT }, StringSplitOptions.RemoveEmptyEntries); if (elems.Length != 4) { return(false); } //内容チェック if (elems[0] != Identifier) { return(false); } if (int.TryParse(elems[1], out var iterations) == false) { return(false); } //文字列をバイト配列に変換 var salt = ConvertStringToByte(elems[2]); var dk = ConvertStringToByte(elems[3]); //出力 result = new PBKDF2Hash(iterations, salt, dk); return(true); }