Ejemplo n.º 1
0
        /// <summary>バイト配列のハッシュ値を計算して返す。</summary>
        /// <param name="asb">バイト配列</param>
        /// <param name="ekha">ハッシュ(キー付き)アルゴリズム列挙型</param>
        /// <param name="password">使用するパスワード</param>
        /// <param name="salt">ソルト</param>
        /// <param name="stretchCount">ストレッチ回数</param>
        /// <returns>ハッシュ値(バイト配列)</returns>
        public static byte[] GetKeyedHashBytes(byte[] asb, EnumKeyedHashAlgorithm ekha, string password, byte[] salt, int stretchCount)
        {
            // キーを生成する。
            Rfc2898DeriveBytes passwordKey = new Rfc2898DeriveBytes(password, salt, stretchCount);
            // HMACMD5      :どのサイズのキーでも受け入れる ◯
            // HMACRIPEMD160:どのサイズのキーでも受け入れる ◯
            // HMACSHA1     :どのサイズのキーでも受け入れる ◯
            // HMACSHA256   :どのサイズのキーでも受け入れる ◯
            // HMACSHA384   :どのサイズのキーでも受け入れる ◯
            // HMACSHA512   :どのサイズのキーでも受け入れる ◯
            // MACTripleDES :長さが 16 または 24 バイトのキーを受け入れる

            // ハッシュ(キー付き)サービスプロバイダを生成
            KeyedHashAlgorithm kha = GetKeyedHash.CreateKeyedHashAlgorithmServiceProvider(
                ekha,
                passwordKey.GetBytes(24)     // 上記より、24 決め打ちとする。
                );

            // ハッシュ(キー付き)を生成して返す。
            byte[] temp = kha.ComputeHash(asb);

            kha.Clear(); // devps(1725)

            return(temp);
        }
Ejemplo n.º 2
0
        /// <summary>バイト配列のハッシュ値を計算して返す。</summary>
        /// <param name="data">データ(バイト配列)</param>
        /// <param name="ekha">ハッシュ(キー付き)アルゴリズム列挙型</param>
        /// <param name="key">キー(バイト配列)</param>
        /// <returns>ハッシュ値(バイト配列)</returns>
        public static byte[] GetKeyedHashBytes(byte[] data, EnumKeyedHashAlgorithm ekha, byte[] key)
        {
            // HMACMD5      :どのサイズのキーでも受け入れる ◯
            // HMACRIPEMD160:どのサイズのキーでも受け入れる ◯
            // HMACSHA1     :どのサイズのキーでも受け入れる ◯
            // HMACSHA256   :どのサイズのキーでも受け入れる ◯
            // HMACSHA384   :どのサイズのキーでも受け入れる ◯
            // HMACSHA512   :どのサイズのキーでも受け入れる ◯
            // MACTripleDES :長さが 16 または 24 バイトのキーを受け入れる
            if (ekha == EnumKeyedHashAlgorithm.MACTripleDES)
            {
                if (24 <= key.Length)
                {
                    key = ArrayOperator.ShortenByteArray(key, 24);
                }
                else if (16 <= key.Length)
                {
                    key = ArrayOperator.ShortenByteArray(key, 16);
                }
                else
                {
                    throw new ArgumentException(
                              PublicExceptionMessage.ARGUMENT_INCORRECT, "byte[] key");
                }
            }

#if NETSTD
            // NETSTDの場合の実装
            if (ekha == EnumKeyedHashAlgorithm.HMACRIPEMD160)
            {
                return(GetKeyedHash.GetMacBytesByBC(
                           data, key, new HMac(new RipeMD160Digest())));
            }
            else if (ekha == EnumKeyedHashAlgorithm.MACTripleDES)
            {
                return(GetKeyedHash.GetMacBytesByBC(
                           data, key, new CbcBlockCipherMac(new DesEdeEngine(), 64)));
            }
#endif

            // ハッシュ(キー付き)サービスプロバイダを生成
            KeyedHashAlgorithm kha = HashAlgorithmCmnFunc.
                                     CreateKeyedHashAlgorithmSP(ekha, key);

            // ハッシュ(キー付き)を生成して返す。
            byte[] temp = kha.ComputeHash(data);

            kha.Clear(); // devps(1725)

            return(temp);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Password entered by the userをDB保存する際、
        /// Salted and hashed passwordとして保存する必要がある。
        /// </summary>
        /// <param name="rawPassword">Password entered by the user.</param>
        /// <param name="ekha">ハッシュ・アルゴリズム列挙型</param>
        /// <param name="key">キー</param>
        /// <param name="saltLength">ソルトの文字列長</param>
        /// <param name="stretchCount">ストレッチ回数</param>
        /// <returns>Salted and hashed password.</returns>
        public static string GetSaltedPassword(string rawPassword, EnumKeyedHashAlgorithm ekha, string key, int saltLength, int stretchCount)
        {
            // ランダム・ソルト文字列を生成(区切り記号は含まなくても良い)
            string salt = GetPassword.Generate(saltLength, 0); //Membership.GeneratePassword(saltLength, 0);

            byte[] saltByte = CustomEncode.StringToByte(salt, CustomEncode.UTF_8);

            // Salted and hashed password(文字列)を生成して返す。
            return
                (CustomEncode.ToBase64String(CustomEncode.StringToByte(key, CustomEncode.UTF_8))
                 + "." + CustomEncode.ToBase64String(saltByte)
                 + "." + CustomEncode.ToBase64String(CustomEncode.StringToByte(stretchCount.ToString(), CustomEncode.UTF_8))
                 + "." + CustomEncode.ToBase64String(CustomEncode.StringToByte(
                                                         GetKeyedHash.GetKeyedHashString(salt + rawPassword, ekha, key, saltByte, stretchCount), CustomEncode.UTF_8)));
        }
Ejemplo n.º 4
0
        /// <summary>パスワードを比較して認証する。</summary>
        /// <param name="rawPassword">Password entered by the user.</param>
        /// <param name="saltedPassword">Salted and hashed password.</param>
        /// <param name="ekha">ハッシュ・アルゴリズム列挙型</param>
        /// <returns>
        /// true:パスワードは一致した。
        /// false:パスワードは一致しない。
        /// </returns>
        public static bool EqualSaltedPassword(string rawPassword, string saltedPassword, EnumKeyedHashAlgorithm ekha)
        {
            // ソルト部分を取得
            string[] temp = saltedPassword.Split('.');
            string   key  = CustomEncode.ByteToString(CustomEncode.FromBase64String(temp[0]), CustomEncode.UTF_8);

            byte[] saltByte       = CustomEncode.FromBase64String(temp[1]);
            string salt           = CustomEncode.ByteToString(saltByte, CustomEncode.UTF_8);
            int    stretchCount   = int.Parse(CustomEncode.ByteToString(CustomEncode.FromBase64String(temp[2]), CustomEncode.UTF_8));
            string hashedPassword = CustomEncode.ByteToString(CustomEncode.FromBase64String(temp[3]), CustomEncode.UTF_8);

            // 引数のsaltedPasswordと、rawPasswordから自作したsaltedPasswordを比較
            if (hashedPassword == GetKeyedHash.GetKeyedHashString(salt + rawPassword, ekha, key, saltByte, stretchCount))
            {
                // 一致した。
                return(true);
            }
            else
            {
                // 一致しなかった。
                return(false);
            }
        }
Ejemplo n.º 5
0
 /// <summary>バイト配列のハッシュ値を計算して返す。</summary>
 /// <param name="asb">バイト配列</param>
 /// <param name="ekha">ハッシュ(キー付き)アルゴリズム列挙型</param>
 /// <param name="password">使用するパスワード</param>
 /// <param name="salt">ソルト</param>
 /// <returns>ハッシュ値(バイト配列)</returns>
 public static byte[] GetKeyedHashBytes(byte[] asb, EnumKeyedHashAlgorithm ekha, string password, byte[] salt)
 {
     return(GetKeyedHash.GetKeyedHashBytes(
                asb, ekha, password, salt, GetKeyedHash.StretchCount));
 }
Ejemplo n.º 6
0
 /// <summary>バイト配列のハッシュ値を計算して返す。</summary>
 /// <param name="asb">バイト配列</param>
 /// <param name="ekha">ハッシュ(キー付き)アルゴリズム列挙型</param>
 /// <param name="password">使用するパスワード</param>
 /// <returns>ハッシュ値(バイト配列)</returns>
 public static byte[] GetKeyedHashBytes(byte[] asb, EnumKeyedHashAlgorithm ekha, string password)
 {
     return(GetKeyedHash.GetKeyedHashBytes(
                asb, ekha, password, CustomEncode.StringToByte(GetKeyedHash._salt, CustomEncode.UTF_8), GetKeyedHash.StretchCount));
 }
Ejemplo n.º 7
0
 /// <summary>文字列のハッシュ値を計算して返す。</summary>
 /// <param name="ss">文字列</param>
 /// <param name="ekha">ハッシュ(キー付き)アルゴリズム列挙型</param>
 /// <param name="password">使用するパスワード</param>
 /// <param name="salt">ソルト</param>
 /// <returns>ハッシュ値(文字列)</returns>
 public static string GetKeyedHashString(string ss, EnumKeyedHashAlgorithm ekha, string password, byte[] salt)
 {
     return(GetKeyedHash.GetKeyedHashString(
                ss, ekha, password, salt, GetKeyedHash.StretchCount));
 }
Ejemplo n.º 8
0
 /// <summary>文字列のハッシュ値を計算して返す。</summary>
 /// <param name="ss">文字列</param>
 /// <param name="ekha">ハッシュ(キー付き)アルゴリズム列挙型</param>
 /// <param name="password">使用するパスワード</param>
 /// <returns>ハッシュ値(文字列)</returns>
 public static string GetKeyedHashString(string ss, EnumKeyedHashAlgorithm ekha, string password)
 {
     return(GetKeyedHash.GetKeyedHashString(
                ss, ekha, password, CustomEncode.StringToByte(GetKeyedHash._salt, CustomEncode.UTF_8), GetKeyedHash.StretchCount));
 }
Ejemplo n.º 9
0
 /// <summary>
 /// Password entered by the userをDB保存する際、
 /// Salted and hashed passwordとして保存する必要がある。
 /// </summary>
 /// <param name="rawPassword">Password entered by the user.</param>
 /// <param name="ekha">ハッシュ・アルゴリズム列挙型</param>
 /// <param name="key">キー(システム共通)</param>
 /// <param name="saltLength">ソルトの文字列長</param>
 /// <returns>Salted and hashed password.</returns>
 /// <see ref="http://www.atmarkit.co.jp/ait/articles/1110/06/news154_2.html"/>
 public static string GetSaltedPassword(string rawPassword, EnumKeyedHashAlgorithm ekha, string key, int saltLength)
 {
     // overloadへ
     return(GetKeyedHash.GetSaltedPassword(rawPassword, ekha, key, saltLength, 1));
 }