c#中的哈希字符串

Edy*_* Cu 74 c# string hash

我在尝试获取哈希字符串时遇到问题c#.

我已经尝试了一些网站,但大多数人都使用文件来获取哈希值.其他用于字符串的东西有点复杂.我找到了像这样的Web身份验证示例:

FormsAuthentication.HashPasswordForStoringInConfigFile(tbxPassword.Text.Trim(), "md5")
Run Code Online (Sandbox Code Playgroud)

我需要使用hash来创建一个包含文件名更安全的字符串.我怎样才能做到这一点?

例:

string file  = "username";
string hash = ??????(username); 
Run Code Online (Sandbox Code Playgroud)

我应该使用其他哈希算法而不是"md5"吗?

Dmi*_*nov 159

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();
}
Run Code Online (Sandbox Code Playgroud)

补充说明

  • 由于MD5和SHA1是过时且不安全的算法,因此该解决方案使用SHA256.或者,您可以使用注释中指出的BCryptScrypt.
  • 此外,正如评论中指出的那样,考虑" 腌制 "您的哈希并使用经过验证的加密算法.

  • **不要使用MD5或SHA1**,它们是过时且不安全的算法.至少使用SHA256,甚至更好地使用BCrypt或Scrypt. (39认同)
  • @Muh它可以很容易地用于校验和,因为它比SHA512快得多.但确实存储密码,不推荐,这是正确的. (6认同)
  • 这个`b.ToString("X2")是什么意思? (5认同)
  • @BilalFazlani 请参阅 /sf/ask/1452504371/ (3认同)
  • 仅供参考,如果您**不**使用哈希作为**加密**哈希,例如作为用于比较的内容哈希,那么使用 MD5 或 SHA1 是完全合法的。MD5(例如)的优点是计算速度,因此它们不安全的事实就无关紧要了。 (3认同)

and*_*fox 48

获取用于密码存储目的的哈希字符串的最快方法是以下代码:

    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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

备注:

  • 如果经常调用该方法,sha则应将变量的创建重构为类字段;
  • 输出以编码的十六进制字符串表示;

  • @MuhammadRehanSaeed当我说'SHA1Managed`并不昂贵时,我的意思是它的创造不是.此外,散列算法不是必需的昂贵.当你想要发现碰撞时,它只需要(非常)昂贵. (3认同)

Ehs*_*edi 13

这里的所有哈希代码示例都已过时。在.NET 5中,为我们提供了一种新的散列数据方法,它速度加倍并且零内存分配。那不是很酷吗?您只需HashData(byte[])在您最喜欢的哈希算法类上使用新的静态即可。

byte[] buffer = Encoding.UTF8.GetBytes(input);
byte[] digest = SHA256.HashData(buffer);
Run Code Online (Sandbox Code Playgroud)

Microsoft在其分析器中有一条新规则,用于检测旧的用法并用新的 API 替换它们。

  • @Servy计算时间取决于您选择的算法。哈希算法的传统实现在 CPU 和内存方面性能不佳。这意味着在正常情况下,它们会给您的服务器带来不必要的更多负载。如果你想要安全,你仍然需要明智地选择你的算法,但这并不意味着你应该选择实施不佳的遗留 API。 (11认同)
  • @Servy你的观点是正确的,但与我的帖子完全无关。 (5认同)

Cyr*_*pta 8

我真的不明白你问题的全部范围,但是如果你需要的只是字符串的哈希值,那么很容易得到它.

只需使用GetHashCode方法即可.

像这样:

string hash = username.GetHashCode();
Run Code Online (Sandbox Code Playgroud)

  • 不存储来自GetHashCode的值,它对于32x和64x是不同的 (11认同)
  • 这是创建密码哈希的坏方法.使用GetHashCode(),您不能假设将生成不同计算机的相同数字.使用Sha1哈希方法或其他东西(稍后我会发布一个例子) (9认同)
  • 你为什么要用双引号输入用户名?这将得到"用户名"这个词的哈希值,现在是用户名变量中的内容. (3认同)
  • 应该注意的是,`GetHashCode` 不是加密安全的散列算法。至少使用 SHA256,甚至更好地使用 BCrypt 或 Scrypt 来获得安全算法。 (2认同)

Pie*_*kel 5

我认为你所寻找的不是散列而是加密.使用散列,您将无法从"散列"变量中检索原始文件名.使用加密,您可以,并且它是安全的.

有关.NET加密的更多信息,请参阅ASP.NET中的AES with VB.NET.