/// <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>パスワードを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>バイト配列のハッシュ値を計算して返す。</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> /// 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="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> /// 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(GetHash.GetSaltedPassword(rawPassword, eha, saltLength, 1)); }
/// <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)); }