【问题标题】:Hash Function .NET哈希函数.NET
【发布时间】:2011-07-10 03:46:59
【问题描述】:

我应该编写一个应用程序,它接受字符串输入并计算字符串的哈希值(输入的最大字符为 16 个),输出的长度应为 base64 格式的 22 个字符(或更少但不超过) .

我看到 .NET 框架建议了许多哈希函数,但我不知道该使用什么, 谁能推荐我最好的功能是什么,如何将输出限制为 22 个字符?

谢谢

【问题讨论】:

  • 您打算将哈希函数用于加密目的还是哈希表?
  • @Ani:22 字节的 base64 输出建议使用加密哈希函数而不是哈希表(通常使用机器字大小的哈希)。
  • MD5 [Link][1] 和 SHA-1 不再安全。选择 SHA-2 或 SHA-3 [1]:security.stackexchange.com/questions/19906/…

标签: c# hash hashcode


【解决方案1】:

您可以使用提供 128 位输出的 MD5,然后在转换为 base64 时丢弃最后两个字符,因为它们始终是“==”(填充)。这应该给你 22 个字符。

string GetEncodedHash(string password, string salt)
{
   MD5 md5 = new MD5CryptoServiceProvider();
   byte [] digest = md5.ComputeHash(Encoding.UTF8.GetBytes(password + salt);
   string base64digest = Convert.ToBase64String(digest, 0, digest.Length);
   return base64digest.Substring(0, base64digest.Length-2);
}

【讨论】:

    【解决方案2】:

    您可以使用任何散列函数并将散列截断为所需的大小,然后转换为 base-64。在您的情况下,您需要将散列截断为 15 字节,最终为 20 字节的 base-64。我将重用我之前的示例。

    string secretKey = "MySecretKey";
    string salt = "123";
    System.Security.Cryptography.SHA1 sha = System.Security.Cryptography.SHA1.Create();
    byte[] preHash = System.Text.Encoding.UTF32.GetBytes(secretKey + salt);
    byte[] hash = sha.ComputeHash(preHash);
    string password = prefix + System.Convert.ToBase64String(hash, 0, 15);
    

    【讨论】:

      【解决方案3】:

      22 base64 字符表示哈希函数的 16 字节输出;您可以使用任何输出 128 位的哈希函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-25
        • 2011-02-27
        • 1970-01-01
        • 2011-08-04
        • 2022-01-03
        • 2011-02-04
        • 2019-07-24
        • 2010-10-13
        相关资源
        最近更新 更多