Пример #1
0
 /// <summary>MAC値を検証</summary>
 /// <param name="msg">メッセージ(文字列)</param>
 /// <param name="ekha">MACアルゴリズム列挙型</param>
 /// <param name="key">キー(文字列)</param>
 /// <param name="mac">MAC値(base64文字列)</param>
 /// <returns>検証結果( true:検証成功, false:検証失敗 )</returns>
 public static bool VerifyMAC(string msg, EnumKeyedHashAlgorithm ekha, string key, string mac)
 {
     return(MsgAuthCode.VerifyMAC(
                CustomEncode.StringToByte(msg, CustomEncode.UTF_8),
                ekha, CustomEncode.StringToByte(key, CustomEncode.UTF_8),
                CustomEncode.FromBase64String(mac)));
 }
Пример #2
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);

            // KeyedHashのキーを生成する。
            Rfc2898DeriveBytes passwordKey = new Rfc2898DeriveBytes(key, saltByte, stretchCount);

            // Salted and hashed password(文字列)を生成して返す。
            return

                // key
                (CustomEncode.ToBase64String(CustomEncode.StringToByte(key, CustomEncode.UTF_8))

                 // saltByte
                 + "." + CustomEncode.ToBase64String(saltByte)

                 // stretchCount
                 + "." + CustomEncode.ToBase64String(CustomEncode.StringToByte(stretchCount.ToString(), CustomEncode.UTF_8))

                 // Salted and hashed password
                 + "." + CustomEncode.ToBase64String(
                     GetPasswordHashV2.GetKeyedHashBytes(
                         CustomEncode.StringToByte(salt + rawPassword, CustomEncode.UTF_8),
                         ekha, passwordKey.GetBytes(24))));
        }
Пример #3
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);
        }
Пример #4
0
        /// <summary>MAC値を検証</summary>
        /// <param name="msg">メッセージ(バイト配列)</param>
        /// <param name="ekha">MACアルゴリズム列挙型</param>
        /// <param name="key">キー(バイト配列)</param>
        /// <param name="mac">MAC値(バイト配列)</param>
        /// <returns>検証結果( true:検証成功, false:検証失敗 )</returns>
        public static bool VerifyMAC(byte[] msg, EnumKeyedHashAlgorithm ekha, byte[] key, byte[] mac)
        {
            // 文字列にしてから計算
            string paramMac = CustomEncode.ToBase64String(mac);
            string calcMac  = CustomEncode.ToBase64String(MsgAuthCode.GetMAC(msg, ekha, key));

            return(paramMac == calcMac);
        }
Пример #5
0
 /// <summary>文字列のハッシュ値を計算して返す。</summary>
 /// <param name="ss">文字列</param>
 /// <param name="ekha">ハッシュ(キー付き)アルゴリズム列挙型</param>
 /// <param name="password">使用するパスワード</param>
 /// <param name="salt">ソルト</param>
 /// <param name="stretching">ストレッチング</param>
 /// <returns>ハッシュ値(文字列)</returns>
 public static string GetKeyedHashString(string ss, EnumKeyedHashAlgorithm ekha, string password, byte[] salt, int stretching)
 {
     // ハッシュ(Base64)
     return(CustomEncode.ToBase64String(
                GetKeyedHashBytes(
                    CustomEncode.StringToByte(ss, CustomEncode.UTF_8),
                    ekha, password, salt, stretching)));
 }
Пример #6
0
        /// <summary>ハッシュ(キー付き)サービスプロバイダの生成</summary>
        /// <param name="ekha">ハッシュ(キー付き)サービスプロバイダの列挙型</param>
        /// <param name="key">キー</param>
        /// <returns>ハッシュ(キー付き)サービスプロバイダ</returns>
        private static KeyedHashAlgorithm CreateKeyedHashAlgorithmServiceProvider(EnumKeyedHashAlgorithm ekha, byte[] key)
        {
            // ハッシュ(キー付き)サービスプロバイダ
            KeyedHashAlgorithm kha = null;

            // HMACSHA1.Create(); だと、全部、HMACSHA1になってしまう現象があったので、
            // 全部、= new HMACSHA1(key); のスタイルに変更した。

            if (ekha == EnumKeyedHashAlgorithm.Default)
            {
                // 既定の暗号化サービスプロバイダ
                kha = new HMACSHA1(key); // devps(1703)
            }
            else if (ekha == EnumKeyedHashAlgorithm.HMACSHA1)
            {
                // HMACSHA1サービスプロバイダ
                kha = new HMACSHA1(key); // devps(1703)
            }
            // -- ▼追加▼ --
            else if (ekha == EnumKeyedHashAlgorithm.HMACMD5)
            {
                // HMACMD5サービスプロバイダ
                kha = new HMACMD5(key);
            }
            else if (ekha == EnumKeyedHashAlgorithm.HMACRIPEMD160)
            {
                // HMACRIPEMD160サービスプロバイダ
                kha = new HMACRIPEMD160(key);
            }
            else if (ekha == EnumKeyedHashAlgorithm.HMACSHA256)
            {
                // HMACSHA256サービスプロバイダ
                kha = new HMACSHA256(key);
            }
            else if (ekha == EnumKeyedHashAlgorithm.HMACSHA384)
            {
                // HMACSHA384サービスプロバイダ
                kha = new HMACSHA384(key);
            }
            else if (ekha == EnumKeyedHashAlgorithm.HMACSHA512)
            {
                // HMACSHA512サービスプロバイダ
                kha = new HMACSHA512(key);
            }
            // -- ▲追加▲ --
            else if (ekha == EnumKeyedHashAlgorithm.MACTripleDES)
            {
                // MACTripleDESサービスプロバイダ
                kha = new MACTripleDES(key); // devps(1703)
            }

            return(kha);
        }
Пример #7
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);
        }
Пример #8
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)));
        }
        /// <summary>バイト配列のハッシュ値を計算して返す。</summary>
        /// <param name="asb">バイト配列</param>
        /// <param name="ekha">ハッシュ(キー付き)アルゴリズム列挙型</param>
        /// <param name="password">使用するパスワード</param>
        /// <param name="salt">ソルト</param>
        /// <param name="stretchCount">ストレッチ回数</param>
        /// <returns>ハッシュ値(バイト配列)</returns>
        private 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 バイトのキーを受け入れる

            // ハッシュ(キー付き)サービスプロバイダを生成

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

            KeyedHashAlgorithm kha = HashAlgorithmCmnFunc.CreateKeyedHashAlgorithmSP(
                ekha,
                passwordKey.GetBytes(24)     // 上記より、24 決め打ちとする。
                );

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

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

            return(temp);
        }
Пример #10
0
        [TestCase(null, 999, "test@123", ExpectedException = typeof(ArgumentNullException), TestName = "TestID-018A")]       // The encryption method that is not defined
        public void GetKeyedHashStringTest(string sourceString, EnumKeyedHashAlgorithm eha, string password)
        {
            try
            {
                // Get the hash value using the components of touryo.
                string hashString = GetKeyedHash.GetKeyedHashString(sourceString, eha, password);

                // Using the components of touryo, and get the hash value again.
                string hashString2 = GetKeyedHash.GetKeyedHashString(sourceString, eha, password);

                // Check the hash value.
                Assert.AreNotEqual(sourceString, hashString);
                Assert.AreNotEqual(sourceString, hashString2);
                Assert.AreEqual(hashString, hashString2);
            }
            catch (Exception ex)
            {
                // Print a stack trace when an exception occurs.
                Console.WriteLine(":" + ex.StackTrace);
                throw;
            }
        }
Пример #11
0
        public void GetKeyedHashBytesTest(byte[] asb, EnumKeyedHashAlgorithm eha, string password)
        {
            try
            {
                // anyWarp 棟梁の部品を使用してハッシュ値を取得
                byte[] hashBytes = GetKeyedHash.GetKeyedHashBytes(asb, eha, password);

                // anyWarp 棟梁の部品を使用して、もう一度ハッシュ値を取得
                byte[] hashBytes2 = GetKeyedHash.GetKeyedHashBytes(asb, eha, password);

                // ハッシュ値が同じかどうかをチェック
                Assert.AreNotEqual(asb, hashBytes);
                Assert.AreNotEqual(asb, hashBytes2);
                Assert.AreEqual(hashBytes, hashBytes2);
            }
            catch (Exception ex)
            {
                // Print a stack trace when an exception occurs.
                Console.WriteLine(ex.StackTrace);
                throw;
            }
        }
Пример #12
0
        /// <summary>ハッシュ(キー付き)サービスプロバイダの生成</summary>
        /// <param name="ekha">ハッシュ(キー付き)サービスプロバイダの列挙型</param>
        /// <returns>ハッシュ(キー付き)サービスプロバイダ</returns>
        private static KeyedHashAlgorithm CreateKeyedHashAlgorithmServiceProvider(EnumKeyedHashAlgorithm ekha)
        {
            // ハッシュ(キー付き)サービスプロバイダ
            KeyedHashAlgorithm kha = null;

            if (ekha == EnumKeyedHashAlgorithm.Default)
            {
                // 既定の暗号化サービスプロバイダ
                kha = KeyedHashAlgorithm.Create(); // devps(1703)
            }
            else if (ekha == EnumKeyedHashAlgorithm.HMACSHA1)
            {
                // HMACSHA1サービスプロバイダ
                kha = HMACSHA1.Create(); // devps(1703)
            }
            else if (ekha == EnumKeyedHashAlgorithm.MACTripleDES)
            {
                // MACTripleDESサービスプロバイダ
                kha = MACTripleDES.Create(); // devps(1703)
            }

            return(kha);
        }
Пример #13
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);
            }
        }
Пример #14
0
 /// <summary>文字列のハッシュ値を計算して返す。</summary>
 /// <param name="data">データ(文字列)</param>
 /// <param name="ekha">ハッシュ(キー付き)アルゴリズム列挙型</param>
 /// <param name="key">キー(文字列)</param>
 /// <returns>ハッシュ値(base64文字列)</returns>
 public static string GetKeyedHashString(string data, EnumKeyedHashAlgorithm ekha, string key)
 {
     return(CustomEncode.ToBase64String(GetKeyedHashBytes(
                                            CustomEncode.StringToByte(data, CustomEncode.UTF_8),
                                            ekha, CustomEncode.StringToByte(key, CustomEncode.UTF_8))));
 }
Пример #15
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));
 }
Пример #16
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('.');

            // key
            string key = CustomEncode.ByteToString(CustomEncode.FromBase64String(temp[0]), CustomEncode.UTF_8);

            // saltByte
            byte[] saltByte = CustomEncode.FromBase64String(temp[1]);

            // salt
            string salt = CustomEncode.ByteToString(saltByte, CustomEncode.UTF_8);

            // stretchCount
            int stretchCount = int.Parse(CustomEncode.ByteToString(CustomEncode.FromBase64String(temp[2]), CustomEncode.UTF_8));

            // Salted and hashed password
            string hashedPassword = temp[3];

            // KeyedHashのキーを生成する。
            Rfc2898DeriveBytes passwordKey = new Rfc2898DeriveBytes(key, saltByte, stretchCount);

            // 引数のsaltedPasswordと、rawPasswordから自作したsaltedPasswordを比較
            string compare = CustomEncode.ToBase64String(
                GetPasswordHashV2.GetKeyedHashBytes(
                    CustomEncode.StringToByte(salt + rawPassword, CustomEncode.UTF_8),
                    ekha, passwordKey.GetBytes(24)));

            if (hashedPassword == compare)
            {
                // 一致した。
                return(true);
            }
            else
            {
                // 一致しなかった。
                return(false);
            }
        }
Пример #17
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.Stretching);
 }
Пример #18
0
 /// <summary>MAC値を返す。</summary>
 /// <param name="msg">メッセージ(バイト配列)</param>
 /// <param name="ekha">MACアルゴリズム列挙型</param>
 /// <param name="key">キー(バイト配列)</param>
 /// <returns>MAC値(バイト配列)</returns>
 public static byte[] GetMAC(byte[] msg, EnumKeyedHashAlgorithm ekha, byte[] key)
 {
     return(MsgAuthCode.GetKeyedHashBytes(msg, ekha, key));
 }
Пример #19
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));
 }
Пример #20
0
        public void GetKeyedHashBytesTest2(byte[] asb, EnumKeyedHashAlgorithm eha, string password, byte[] salt)
        {
            try
            {
                // anyWarp 棟梁の部品を使用してハッシュ値を取得
                byte[] hashBytes = GetKeyedHash.GetKeyedHashBytes(asb, eha, password, salt);

                // anyWarp 棟梁の部品を使用して、もう一度ハッシュ値を取得
                byte[] hashBytes2 = GetKeyedHash.GetKeyedHashBytes(asb, eha, password, salt);

                // ハッシュ値が同じかどうかをチェック
                Assert.AreNotEqual(asb, hashBytes);
                Assert.AreNotEqual(asb, hashBytes2);
                Assert.AreEqual(hashBytes, hashBytes2);
            }
            catch (Exception ex)
            {
                // Print a stack trace when an exception occurs.
                Console.WriteLine(ex.StackTrace);
                throw;
            }
        }
Пример #21
0
 /// <summary>MAC値を返す。</summary>
 /// <param name="msg">メッセージ(文字列)</param>
 /// <param name="ekha">MACアルゴリズム列挙型</param>
 /// <param name="key">キー(文字列)</param>
 /// <returns>MAC値(base64文字列)</returns>
 public static string GetMAC(string msg, EnumKeyedHashAlgorithm ekha, string key)
 {
     return(CustomEncode.ToBase64String(MsgAuthCode.GetMAC(
                                            CustomEncode.StringToByte(msg, CustomEncode.UTF_8),
                                            ekha, CustomEncode.StringToByte(key, CustomEncode.UTF_8))));
 }
Пример #22
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, GetKeyedHash.Salt, GetKeyedHash.Stretching);
 }
Пример #23
0
        /// <summary>ハッシュ(キー付き)サービスプロバイダの生成</summary>
        /// <param name="ekha">ハッシュ(キー付き)サービスプロバイダの列挙型</param>
        /// <returns>ハッシュ(キー付き)サービスプロバイダ</returns>
        private static KeyedHashAlgorithm CreateKeyedHashAlgorithmServiceProvider(EnumKeyedHashAlgorithm ekha)
        {
            // ハッシュ(キー付き)サービスプロバイダ
            KeyedHashAlgorithm kha = null;

            if (ekha == EnumKeyedHashAlgorithm.Default)
            {
                // 既定の暗号化サービスプロバイダ
                kha = KeyedHashAlgorithm.Create(); // devps(1703)
            }
            else if (ekha == EnumKeyedHashAlgorithm.HMACSHA1)
            {
                // HMACSHA1サービスプロバイダ
                kha = HMACSHA1.Create(); // devps(1703)
            }
            else if (ekha == EnumKeyedHashAlgorithm.MACTripleDES)
            {
                // MACTripleDESサービスプロバイダ
                kha = MACTripleDES.Create(); // devps(1703)
            }

            return kha;
        }
Пример #24
0
 /// <summary>文字列のハッシュ値を計算して返す。</summary>
 /// <param name="ss">文字列</param>
 /// <param name="ekha">ハッシュ(キー付き)アルゴリズム列挙型</param>
 /// <param name="password">使用するパスワード</param>
 /// <param name="salt">ソルト</param>
 /// <param name="stretching">ストレッチング</param>
 /// <returns>ハッシュ値(文字列)</returns>
 public static string GetKeyedHashString(string ss, EnumKeyedHashAlgorithm ekha, string password, byte[] salt, int stretching)
 {
     // ハッシュ(Base64)
     return CustomEncode.ToBase64String(
         GetKeyedHashBytes(
             CustomEncode.StringToByte(ss, CustomEncode.UTF_8),
             ekha, password, salt, stretching));
 }
Пример #25
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));
 }
Пример #26
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));
 }
Пример #27
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, GetKeyedHash.Salt, GetKeyedHash.Stretching));
 }
Пример #28
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));
 }
Пример #29
0
        public void GetKeyedHashStringTest2(string sourceString, EnumKeyedHashAlgorithm eha, string password, byte[] salt)
        {
            try
            {
                // Get the Salt password using the components of touryo. 
                string hashString = GetKeyedHash.GetKeyedHashString(sourceString, eha, password, salt);

                // Using the components of touryo, and get the hash value again.
                string hashString2 = GetKeyedHash.GetKeyedHashString(sourceString, eha, password, salt);

                // Check the hash value.
                Assert.AreNotEqual(sourceString, hashString);
                Assert.AreNotEqual(sourceString, hashString2);
                Assert.AreEqual(hashString, hashString2);
            }
            catch (Exception ex)
            {
                // Print a stack trace when an exception occurs.
                Console.WriteLine(ex.StackTrace);
                throw;
            }
        }
Пример #30
0
        /// <summary>ハッシュ(キー付き)サービスプロバイダの生成</summary>
        /// <param name="ekha">ハッシュ(キー付き)サービスプロバイダの列挙型</param>
        /// <param name="key">キー</param>
        /// <returns>ハッシュ(キー付き)サービスプロバイダ</returns>
        public static KeyedHashAlgorithm CreateKeyedHashAlgorithmSP(EnumKeyedHashAlgorithm ekha, byte[] key)
        {
            // ハッシュ(キー付き)サービスプロバイダ
            KeyedHashAlgorithm kha = null;

            // HMACSHA1.Create(); だと、全部、HMACSHA1になってしまう現象があったので、
            // 全部、= new HMACSHA1(key); のスタイルに変更した。

            if (ekha == EnumKeyedHashAlgorithm.Default)
            {
                // 既定の暗号化サービスプロバイダ
                kha = new HMACSHA1(key); // devps(1703)
            }

            else if (ekha == EnumKeyedHashAlgorithm.HMACSHA1)
            {
                // HMACSHA1サービスプロバイダ
                kha = new HMACSHA1(key); // devps(1703)
            }
            // -- ▼追加▼ --
            else if (ekha == EnumKeyedHashAlgorithm.HMACMD5)
            {
                // HMACMD5サービスプロバイダ
                kha = new HMACMD5(key);
            }
            else if (ekha == EnumKeyedHashAlgorithm.HMACRIPEMD160)
            {
#if NETSTD
                kha = null; // BouncyCastleを使用する。
#else
                // HMACRIPEMD160サービスプロバイダ
                kha = new HMACRIPEMD160(key);
#endif
            }
            else if (ekha == EnumKeyedHashAlgorithm.HMACSHA256)
            {
                // HMACSHA256サービスプロバイダ
                kha = new HMACSHA256(key);
            }
            else if (ekha == EnumKeyedHashAlgorithm.HMACSHA384)
            {
                // HMACSHA384サービスプロバイダ
                kha = new HMACSHA384(key);
            }
            else if (ekha == EnumKeyedHashAlgorithm.HMACSHA512)
            {
                // HMACSHA512サービスプロバイダ
                kha = new HMACSHA512(key);
            }
            // -- ▲追加▲ --
            else if (ekha == EnumKeyedHashAlgorithm.MACTripleDES)
            {
#if NETSTD
                kha = null; // BouncyCastleを使用する。
#else
                // MACTripleDESサービスプロバイダ
                kha = new MACTripleDES(key); // devps(1703)
#endif
            }
            else
            {
                throw new ArgumentException(
                          PublicExceptionMessage.ARGUMENT_INCORRECT, "EnumKeyedHashAlgorithm ekha");
            }

            return(kha);
        }
Пример #31
0
        /// <summary>バイト配列のハッシュ値を計算して返す。</summary>
        /// <param name="asb">バイト配列</param>
        /// <param name="ekha">ハッシュ(キー付き)アルゴリズム列挙型</param>
        /// <param name="password">使用するパスワード</param>
        /// <param name="salt">ソルト</param>
        /// <param name="stretching">ストレッチング</param>
        /// <returns>ハッシュ値(バイト配列)</returns>
        public static byte[] GetKeyedHashBytes(byte[] asb, EnumKeyedHashAlgorithm ekha, string password, byte[] salt, int stretching)
        {
            // ハッシュ(キー付き)サービスプロバイダを生成
            KeyedHashAlgorithm kha = GetKeyedHash.CreateKeyedHashAlgorithmServiceProvider(ekha);

            // キーを生成する。
            Rfc2898DeriveBytes passwordKey = new Rfc2898DeriveBytes(password, salt, stretching);
            // HMACSHA1     :どのサイズのキーでも受け入れる
            // MACTripleDES :長さが 16 または 24 バイトのキーを受け入れる
            kha.Key = passwordKey.GetBytes(24); // 上記より、24 決め打ちとする。

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