Ejemplo n.º 1
0
        //検証する
        //引数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));
            }
        }
Ejemplo n.º 2
0
        //検証する
        //引数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));
        }
Ejemplo n.º 3
0
        //文字列の形式が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);
        }