/// <summary>文字列のハッシュ値を計算して返す。</summary> /// <param name="sourceString">文字列</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <returns>ハッシュ値(文字列)</returns> public static string GetHashString(string sourceString, EnumHashAlgorithm eha) { // ハッシュ(Base64) return(CustomEncode.ToBase64String( GetHash.GetHashBytes( CustomEncode.StringToByte(sourceString, CustomEncode.UTF_8), eha))); }
/// <summary>constructor</summary> /// <param name="rsNNN">JWS_RSA.RS</param> public RsaKeyConverter(JWS_RSA.RS rsNNN) { this.RSnnn = rsNNN; switch (this.RSnnn) { case JWS_RSA.RS._256: this.JwtConstRSnnn = JwtConst.RS256; this.HashName = HashNameConst.SHA256; this.HashAlgorithm = EnumHashAlgorithm.SHA256_M; break; case JWS_RSA.RS._384: this.JwtConstRSnnn = JwtConst.RS384; this.HashName = HashNameConst.SHA384; this.HashAlgorithm = EnumHashAlgorithm.SHA384_M; break; case JWS_RSA.RS._512: this.JwtConstRSnnn = JwtConst.RS512; this.HashName = HashNameConst.SHA512; this.HashAlgorithm = EnumHashAlgorithm.SHA512_M; break; } }
/// <summary>バイト配列のハッシュ値を計算して返す。</summary> /// <param name="asb">バイト配列</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <param name="stretchCount">ストレッチ回数</param> /// <returns>ハッシュ値(バイト配列)</returns> public static byte[] GetHashBytes(byte[] asb, EnumHashAlgorithm eha, int stretchCount) { byte[] temp = null; #if NETSTD // NETSTDの場合の実装 if (eha == EnumHashAlgorithm.RIPEMD160_M) { // ハッシュ値を計算して返す。 temp = GetHash.GetDigestBytesByBC(asb, new RipeMD160Digest()); for (int i = 0; i < stretchCount; i++) { // stretchCountが1以上なら繰り返す。 temp = GetHash.GetDigestBytesByBC(temp, new RipeMD160Digest()); } return(temp); } #endif // ハッシュ(キー無し)サービスプロバイダを生成 HashAlgorithm ha = HashAlgorithmCmnFunc.CreateHashAlgorithmSP(eha); // ハッシュ値を計算して返す。 temp = ha.ComputeHash(asb); for (int i = 0; i < stretchCount; i++) { // stretchCountが1以上なら繰り返す。 temp = ha.ComputeHash(temp); } ha.Clear(); // devps(1725) return(temp); }
/// <summary>constructor</summary> /// <param name="esNNN">JWS_ECDSA.ES</param> public EccKeyConverter(JWS_ECDSA.ES esNNN) { this.ESnnn = esNNN; switch (this.ESnnn) { case JWS_ECDSA.ES._256: this.JwtConstESnnn = JwtConst.ES256; this._hashAlgorithmName = HashAlgorithmName.SHA256; this.HashAlgorithm = EnumHashAlgorithm.SHA256_M; break; case JWS_ECDSA.ES._384: this.JwtConstESnnn = JwtConst.ES384; this._hashAlgorithmName = HashAlgorithmName.SHA384; this.HashAlgorithm = EnumHashAlgorithm.SHA384_M; break; case JWS_ECDSA.ES._512: this.JwtConstESnnn = JwtConst.ES512; this._hashAlgorithmName = HashAlgorithmName.SHA512; this.HashAlgorithm = EnumHashAlgorithm.SHA512_M; break; } }
/// <summary>バイト配列のハッシュ値を計算して返す。</summary> /// <param name="asb">バイト配列</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <returns>ハッシュ値(バイト配列)</returns> public static byte[] GetHashBytes(byte[] asb, EnumHashAlgorithm eha) { // ハッシュ(キー無し)サービスプロバイダを生成 HashAlgorithm ha = GetHash.CreateHashAlgorithmServiceProvider(eha); // ハッシュ値を計算して返す。 byte[] temp = ha.ComputeHash(asb); ha.Clear(); // devps(1725) return(temp); }
/// <summary>パスワードをDB保存する際には塩味パスワードとして保存する。</summary> /// <param name="rawPasswd">ユーザが入力した生のパスワード</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <param name="saltLength">ソルトの文字列長</param> /// <returns>塩味パスワード</returns> public static string GetSaltedPasswd(string rawPasswd, EnumHashAlgorithm eha, int saltLength) { // ランダム・ソルト文字列を生成(区切り記号は含まなくても良い) string salt = Membership.GeneratePassword(saltLength, 0); // 塩味パスワード(文字列)を生成して返す。 return(salt + GetHash.GetHashString(salt + rawPasswd, eha)); // バイト配列仕様は、フィールドが文字列の可能性が高いので辞めた。 }
/// <summary> /// Password entered by the userをDB保存する際、 /// Salted and hashed passwordとして保存する必要がある。 /// </summary> /// <param name="rawPassword">>Password entered by the user.</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <param name="saltLength">ソルトの文字列長</param> /// <param name="stretchCount">ストレッチ回数</param> /// <returns>Salted and hashed password.</returns> public static string GetSaltedPassword(string rawPassword, EnumHashAlgorithm eha, int saltLength, int stretchCount) { // ランダム・ソルト文字列を生成(区切り記号は含まなくても良い) string salt = GetPassword.Generate(saltLength, 0); //Membership.GeneratePassword(saltLength, 0); // Salted and hashed password(文字列)を生成して返す。 return (CustomEncode.ToBase64String(CustomEncode.StringToByte(salt, CustomEncode.UTF_8)) + "." + CustomEncode.ToBase64String(CustomEncode.StringToByte(stretchCount.ToString(), CustomEncode.UTF_8)) + "." + CustomEncode.ToBase64String(CustomEncode.StringToByte(GetHash.GetHashString(salt + rawPassword, eha, stretchCount), CustomEncode.UTF_8))); }
/// <summary>パスワードを比較して認証する。</summary> /// <param name="rawPasswd">ユーザが入力した生のパスワード</param> /// <param name="saltedPasswd">塩味パスワード</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <param name="saltLength">ソルトの文字列長</param> /// <returns> /// true:パスワードは一致した。 /// false:パスワードは一致しない。 /// </returns> public static bool EqualSaltedPasswd(string rawPasswd, string saltedPasswd, EnumHashAlgorithm eha, int saltLength) { // ソルト部分を取得 string salt = saltedPasswd.Substring(0, saltLength); // 引数のsaltedPasswdと、rawPasswdから自作したsaltedPasswdを比較 if (saltedPasswd == salt + GetHash.GetHashString(salt + rawPasswd, eha)) { // 一致した。 return(true); } else { // 一致しなかった。 return(false); } }
/// <summary>バイト配列のハッシュ値を計算して返す。</summary> /// <param name="asb">バイト配列</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <param name="stretchCount">ストレッチ回数</param> /// <returns>ハッシュ値(バイト配列)</returns> public static byte[] GetHashBytes(byte[] asb, EnumHashAlgorithm eha, int stretchCount) { // ハッシュ(キー無し)サービスプロバイダを生成 HashAlgorithm ha = GetHash.CreateHashAlgorithmServiceProvider(eha); // ハッシュ値を計算して返す。 byte[] temp = ha.ComputeHash(asb); for (int i = 0; i < stretchCount; i++) { // stretchCountが1以上なら繰り返す。 temp = ha.ComputeHash(temp); } ha.Clear(); // devps(1725) return(temp); }
/// <summary>ハッシュ(キー無し)サービスプロバイダの生成</summary> /// <param name="eha">ハッシュ(キー無し)サービスプロバイダの列挙型</param> /// <returns>ハッシュ(キー無し)サービスプロバイダ</returns> private static HashAlgorithm CreateHashAlgorithmServiceProvider(EnumHashAlgorithm eha) { // ハッシュ(キー無し)サービスプロバイダ HashAlgorithm ha = null; if (eha == EnumHashAlgorithm.Default) { // 既定の暗号化サービスプロバイダ ha = HashAlgorithm.Create(); // devps(1703) } else if (eha == EnumHashAlgorithm.MD5CryptoServiceProvider) { // MD5CryptoServiceProviderサービスプロバイダ ha = MD5CryptoServiceProvider.Create(); // devps(1703) } else if (eha == EnumHashAlgorithm.SHA1CryptoServiceProvider) { // SHA1CryptoServiceProviderサービスプロバイダ ha = SHA1CryptoServiceProvider.Create(); // devps(1703) } else if (eha == EnumHashAlgorithm.SHA1Managed) { // SHA1Managedサービスプロバイダ ha = SHA1Managed.Create(); // devps(1703) } else if (eha == EnumHashAlgorithm.SHA256Managed) { // SHA256Managedサービスプロバイダ ha = SHA256Managed.Create(); // devps(1703) } else if (eha == EnumHashAlgorithm.SHA384Managed) { // SHA384Managedサービスプロバイダ ha = SHA384Managed.Create(); // devps(1703) } else if (eha == EnumHashAlgorithm.SHA512Managed) { // SHA512Managedサービスプロバイダ ha = SHA512Managed.Create(); // devps(1703) } return(ha); }
public void GetSaltedPasswdTest(string rawPwd, EnumHashAlgorithm eha, int saltLength) { try { // Get the Salt password using the components of touryo. string saltedPasswd = GetHash.GetSaltedPasswd(rawPwd, eha, saltLength); // Check salt password to see if they match. Assert.IsTrue(GetHash.EqualSaltedPasswd(rawPwd, saltedPasswd, eha, saltLength)); // (Just in case) Salt length is different, make sure that the salt passwords do not match. Assert.IsFalse(GetHash.EqualSaltedPasswd(rawPwd, saltedPasswd, eha, saltLength + 1)); } catch (Exception ex) { // Print a stack trace when an exception occurs. Console.WriteLine(ex.StackTrace); throw; } }
[TestCase(null, 999, ExpectedException = typeof(ArgumentNullException), TestName = "TestID-032A")] // The encryption method that is not defined public void EncryptStringTest(string sourceString, EnumHashAlgorithm eha) { try { // Get the hash value using the components of touryo. string hashString = GetHash.GetHashString(sourceString, eha); // Using the components of touryo, and get the hash value again. string hashString2 = GetHash.GetHashString(sourceString, eha); // 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; } }
/// <summary>パスワードを比較して認証する。</summary> /// <param name="rawPasswd">ユーザが入力した生のパスワード</param> /// <param name="saltedPasswd">塩味パスワード</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <param name="saltLength">ソルトの文字列長</param> /// <returns> /// true:パスワードは一致した。 /// false:パスワードは一致しない。 /// </returns> public static bool EqualSaltedPasswd(string rawPasswd, string saltedPasswd, EnumHashAlgorithm eha, int saltLength) { // ソルト部分を取得 string salt = saltedPasswd.Substring(0, saltLength); // 引数のsaltedPasswdと、rawPasswdから自作したsaltedPasswdを比較 if (saltedPasswd == salt + GetHash.GetHashString(salt + rawPasswd, eha)) { // 一致した。 return true; } else { // 一致しなかった。 return false; } }
/// <summary>パスワードを比較して認証する。</summary> /// <param name="rawPassword">Password entered by the user.</param> /// <param name="saltedPassword">Salted and hashed password.</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <returns> /// true:パスワードは一致した。 /// false:パスワードは一致しない。 /// </returns> public static bool EqualSaltedPassword(string rawPassword, string saltedPassword, EnumHashAlgorithm eha) { // ソルト部分を取得 string[] temp = saltedPassword.Split('.'); string salt = CustomEncode.ByteToString(CustomEncode.FromBase64String(temp[0]), CustomEncode.UTF_8); int stretchCount = int.Parse(CustomEncode.ByteToString(CustomEncode.FromBase64String(temp[1]), CustomEncode.UTF_8)); string hashedPassword = CustomEncode.ByteToString(CustomEncode.FromBase64String(temp[2]), CustomEncode.UTF_8); // 引数のsaltedPasswordと、rawPasswordから自作したsaltedPasswordを比較 if (hashedPassword == GetHash.GetHashString(salt + rawPassword, eha, stretchCount)) { // 一致した。 return(true); } else { // 一致しなかった。 return(false); } }
/// <summary>文字列のハッシュ値を計算して返す。</summary> /// <param name="sourceString">文字列</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <returns>ハッシュ値(文字列)</returns> public static string GetHashString(string sourceString, EnumHashAlgorithm eha) { // ハッシュ(Base64) return CustomEncode.ToBase64String( GetHash.GetHashBytes( CustomEncode.StringToByte(sourceString, CustomEncode.UTF_8), eha)); }
/// <summary> /// Password entered by the userをDB保存する際、 /// Salted and hashed passwordとして保存する必要がある。 /// </summary> /// <param name="rawPassword">>Password entered by the user.</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</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, EnumHashAlgorithm eha, int saltLength) { // overloadへ return(GetPasswordHashV2.GetSaltedPassword(rawPassword, eha, saltLength, 1)); }
/// <summary>ハッシュ(キー無し)サービスプロバイダの生成</summary> /// <param name="eha">ハッシュ(キー無し)サービスプロバイダの列挙型</param> /// <returns>ハッシュ(キー無し)サービスプロバイダ</returns> private static HashAlgorithm CreateHashAlgorithmServiceProvider(EnumHashAlgorithm eha) { // ハッシュ(キー無し)サービスプロバイダ HashAlgorithm ha = null; if (eha == EnumHashAlgorithm.Default) { // 既定の暗号化サービスプロバイダ ha = HashAlgorithm.Create(); // devps(1703) } else if (eha == EnumHashAlgorithm.MD5CryptoServiceProvider) { // MD5CryptoServiceProviderサービスプロバイダ ha = MD5CryptoServiceProvider.Create(); // devps(1703) } else if (eha == EnumHashAlgorithm.SHA1CryptoServiceProvider) { // SHA1CryptoServiceProviderサービスプロバイダ ha = SHA1CryptoServiceProvider.Create(); // devps(1703) } else if (eha == EnumHashAlgorithm.SHA1Managed) { // SHA1Managedサービスプロバイダ ha = SHA1Managed.Create(); // devps(1703) } else if (eha == EnumHashAlgorithm.SHA256Managed) { // SHA256Managedサービスプロバイダ ha = SHA256Managed.Create(); // devps(1703) } else if (eha == EnumHashAlgorithm.SHA384Managed) { // SHA384Managedサービスプロバイダ ha = SHA384Managed.Create(); // devps(1703) } else if (eha == EnumHashAlgorithm.SHA512Managed) { // SHA512Managedサービスプロバイダ ha = SHA512Managed.Create(); // devps(1703) } return ha; }
/// <summary>バイト配列のハッシュ値を計算して返す。</summary> /// <param name="asb">バイト配列</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <returns>ハッシュ値(バイト配列)</returns> public static byte[] GetHashBytes(byte[] asb, EnumHashAlgorithm eha) { // ハッシュ(キー無し)サービスプロバイダを生成 HashAlgorithm ha = GetHash.CreateHashAlgorithmServiceProvider(eha); // ハッシュ値を計算して返す。 byte[] temp = ha.ComputeHash(asb); ha.Clear(); // devps(1725) return temp; }
/// <summary>バイト配列のハッシュ値を計算して返す。</summary> /// <param name="asb">バイト配列</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <returns>ハッシュ値(バイト配列)</returns> public static byte[] GetHashBytes(byte[] asb, EnumHashAlgorithm eha) { // overloadへ return(GetHash.GetHashBytes(asb, eha, 1)); }
/// <summary>文字列のハッシュ値を計算して返す。</summary> /// <param name="sourceString">文字列</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <param name="stretchCount">ストレッチ回数</param> /// <returns>ハッシュ値(文字列)</returns> public static string GetHashString(string sourceString, EnumHashAlgorithm eha, int stretchCount) { return(CustomEncode.ToBase64String( GetHash.GetHashBytes( CustomEncode.StringToByte(sourceString, CustomEncode.UTF_8), eha, stretchCount))); }
/// <summary>文字列のハッシュ値を計算して返す。</summary> /// <param name="sourceString">文字列</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <returns>ハッシュ値(文字列)</returns> public static string GetHashString(string sourceString, EnumHashAlgorithm eha) { // overloadへ return(GetHash.GetHashString(sourceString, eha, 1)); }
/// <summary>パスワードをDB保存する際には塩味パスワードとして保存する。</summary> /// <param name="rawPasswd">ユーザが入力した生のパスワード</param> /// <param name="eha">ハッシュ・アルゴリズム列挙型</param> /// <param name="saltLength">ソルトの文字列長</param> /// <returns>塩味パスワード</returns> public static string GetSaltedPasswd(string rawPasswd, EnumHashAlgorithm eha, int saltLength) { // ランダム・ソルト文字列を生成(区切り記号は含まなくても良い) string salt = Membership.GeneratePassword(saltLength, 0); // 塩味パスワード(文字列)を生成して返す。 return salt + GetHash.GetHashString(salt + rawPasswd, eha); // バイト配列仕様は、フィールドが文字列の可能性が高いので辞めた。 }
[TestCase("TestID-032A", null, 999, ExpectedException = typeof(ArgumentNullException))] // The encryption method that is not defined public void EncryptStringTest(string testCaseID, string sourceString, EnumHashAlgorithm eha) { try { // Get the hash value using the components of touryo. string hashString = GetHash.GetHashString(sourceString, eha); // Using the components of touryo, and get the hash value again. string hashString2 = GetHash.GetHashString(sourceString, eha); // 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(testCaseID + ":" + ex.StackTrace); throw; } }
public void GetSaltedPasswdTest(string testCaseID, string rawPwd, EnumHashAlgorithm eha, int saltLength) { try { // Get the Salt password using the components of touryo. string saltedPasswd = GetHash.GetSaltedPasswd(rawPwd, eha, saltLength); // Check salt password to see if they match. Assert.IsTrue(GetHash.EqualSaltedPasswd(rawPwd, saltedPasswd, eha, saltLength)); // (Just in case) Salt length is different, make sure that the salt passwords do not match. Assert.IsFalse(GetHash.EqualSaltedPasswd(rawPwd, saltedPasswd, eha, saltLength + 1)); } catch (Exception ex) { // Print a stack trace when an exception occurs. Console.WriteLine(testCaseID + ":" + ex.StackTrace); throw; } }
/// <summary>ハッシュ(キー無し)サービスプロバイダの生成</summary> /// <param name="eha">ハッシュ(キー無し)サービスプロバイダの列挙型</param> /// <returns>ハッシュ(キー無し)サービスプロバイダ</returns> /// <remarks> /// EnumHashAlgorithmから、HashAlgorithmを生成するために追加。 /// HashAlgorithm.Create(HashNameConst.SHA256) は .NET Core 2 で動作せず。 /// - KeyedHashAlgorithm.Create("HMACSHA1") throw PNSE (on .NET Core 2 /// https://github.com/dotnet/standard/issues/530#issuecomment-375043416 /// </remarks> public static HashAlgorithm CreateHashAlgorithmSP(EnumHashAlgorithm eha) { // ハッシュ(キー無し)サービスプロバイダ HashAlgorithm ha = null; if (eha == EnumHashAlgorithm.Default) { // 既定の暗号化サービスプロバイダ ha = HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(); // devps(1703) } #region MD5 else if (eha == EnumHashAlgorithm.MD5_CSP) { // MD5CryptoServiceProviderサービスプロバイダ ha = MD5CryptoServiceProvider.Create(); // devps(1703) } #if NETSTD #else else if (eha == EnumHashAlgorithm.MD5_CNG) { // MD5Cngサービスプロバイダ ha = MD5Cng.Create(); // devps(1703) } #endif #endregion #region RIPEMD160 else if (eha == EnumHashAlgorithm.RIPEMD160_M) { #if NETSTD ha = null; // BouncyCastleを使用する。 #else // RIPEMD160Managedサービスプロバイダ ha = RIPEMD160Managed.Create(); // devps(1703) #endif } #endregion #region SHA1 else if (eha == EnumHashAlgorithm.SHA1_CSP) { // SHA1CryptoServiceProviderサービスプロバイダ ha = SHA1CryptoServiceProvider.Create(); // devps(1703) } #if NETSTD #else else if (eha == EnumHashAlgorithm.SHA1_CNG) { // SHA1Cngサービスプロバイダ ha = SHA1Cng.Create(); // devps(1703) } #endif else if (eha == EnumHashAlgorithm.SHA1_M) { // SHA1Managedサービスプロバイダ ha = SHA1Managed.Create(); // devps(1703) } #endregion #region SHA256 else if (eha == EnumHashAlgorithm.SHA256_CSP) { // SHA256CryptoServiceProviderサービスプロバイダ ha = SHA256CryptoServiceProvider.Create(); // devps(1703) } #if NETSTD #else else if (eha == EnumHashAlgorithm.SHA256_CNG) { // SHA256Cngサービスプロバイダ ha = SHA256Cng.Create(); // devps(1703) } #endif else if (eha == EnumHashAlgorithm.SHA256_M) { // SHA256Managedサービスプロバイダ ha = SHA256Managed.Create(); // devps(1703) } #endregion #region SHA384 else if (eha == EnumHashAlgorithm.SHA384_CSP) { // SHA384CryptoServiceProviderサービスプロバイダ ha = SHA384CryptoServiceProvider.Create(); // devps(1703) } #if NETSTD #else else if (eha == EnumHashAlgorithm.SHA384_CNG) { // SHA384Cngサービスプロバイダ ha = SHA384Cng.Create(); // devps(1703) } #endif else if (eha == EnumHashAlgorithm.SHA384_M) { // SHA384Managedサービスプロバイダ ha = SHA384Managed.Create(); // devps(1703) } #endregion #region SHA512 else if (eha == EnumHashAlgorithm.SHA512_CSP) { // SHA512CryptoServiceProviderサービスプロバイダ ha = SHA512CryptoServiceProvider.Create(); // devps(1703) } #if NETSTD #else else if (eha == EnumHashAlgorithm.SHA512_CNG) { // SHA512Cngサービスプロバイダ ha = SHA512Cng.Create(); // devps(1703) } #endif else if (eha == EnumHashAlgorithm.SHA512_M) { // SHA512Managedサービスプロバイダ ha = SHA512Managed.Create(); // devps(1703) } #endregion else { // 既定の暗号化サービスプロバイダ ha = HashAlgorithmCmnFunc.GetHashAlgorithmFromNameString(); // devps(1703) } return(ha); }