web-dev-qa-db-ja.com

C#のハッシュ文字列

c#でハッシュ文字列を取得しようとすると問題が発生します。

私はすでにいくつかのウェブサイトを試しましたが、それらのほとんどはハッシュを取得するためにファイルを使用しています。文字列用の他のものは少し複雑すぎます。次のようなWebのWindows認証の例を見つけました。

FormsAuthentication.HashPasswordForStoringInConfigFile(tbxPassword.Text.Trim(), "md5")

ファイル名を含む文字列をより安全にするために、ハッシュを使用する必要があります。どうやってやるの?

例:

string file  = "username";
string hash = ??????(username); 

「md5」ではなく、別のハッシュアルゴリズムを使用する必要がありますか?

68
Edy Cu
using System.Security.Cryptography;

public static byte[] GetHash(string inputString)
{
    HashAlgorithm algorithm = SHA256.Create();
    return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString));
}

public static string GetHashString(string inputString)
{
    StringBuilder sb = new StringBuilder();
    foreach (byte b in GetHash(inputString))
        sb.Append(b.ToString("X2"));

    return sb.ToString();
}

その他の注意事項

  • MD5とSHA1は 廃止され、安全でない アルゴリズムであるため、このソリューションではSHA256を使用します。または、コメントで指摘されているように、 BCrypt または Scrypt を使用できます。
  • また、コメントで指摘されているように、ハッシュを「 salting 」と見なし、実績のある暗号化アルゴリズムを使用します。
150

パスワードを保存する目的でハッシュ文字列を取得する最速の方法は、次のコードです。

    internal static string GetStringSha256Hash(string text)
    {
        if (String.IsNullOrEmpty(text))
            return String.Empty;

        using (var sha = new System.Security.Cryptography.SHA256Managed())
        {
            byte[] textData = System.Text.Encoding.UTF8.GetBytes(text);
            byte[] hash = sha.ComputeHash(textData);
            return BitConverter.ToString(hash).Replace("-", String.Empty);
        }
    }

備考:

  • メソッドが頻繁に呼び出される場合、sha変数の作成をクラスフィールドにリファクタリングする必要があります。
  • 出力は、エンコードされた16進文字列として表示されます。
45
andrew.fox

私はあなたの質問の完全な範囲を本当に理解していませんが、必要なのは文字列のハッシュだけであれば、それを取得するのは非常に簡単です。

GetHashCodeメソッドを使用するだけです。

このような:

string hash = username.GetHashCode();
6
Cyril Gupta

あなたが探しているのはハッシュではなく暗号化だと思います。ハッシュを使用すると、「ハッシュ」変数から元のファイル名を取得できなくなります。暗号化を使用すると、できます、それは安全です。

.NETでの暗号化の詳細については、 ASP.NET with VB.NETのAES を参照してください。

5
//Secure & Encrypte Data
    public static string HashSHA1(string value)
    {
        var sha1 = SHA1.Create();
        var inputBytes = Encoding.ASCII.GetBytes(value);
        var hash = sha1.ComputeHash(inputBytes);
        var sb = new StringBuilder();
        for (var i = 0; i < hash.Length; i++)
        {
            sb.Append(hash[i].ToString("X2"));
        }
        return sb.ToString();
    }
2
Soufiane Neffar