获取字符串的SHA-256字符串

Posted

技术标签:

【中文标题】获取字符串的SHA-256字符串【英文标题】:Obtain SHA-256 string of a string 【发布时间】:2013-06-04 15:52:29 【问题描述】:

我有一些 string,我想使用 C# 使用 SHA-256 散列函数散列它。我想要这样的东西:

 string hashString = sha256_hash("samplestring");

框架中是否有内置的东西可以做到这一点?

【问题讨论】:

msdn.microsoft.com/en-us/library/… 。 -1. 哈希作用于字节,而不是字符串。因此,您首先需要选择一种将字符串转换为字节的编码。我为此推荐 UTF-8。 有件事告诉我,阅读这篇文章的人也应该检查一下:***.com/questions/4948322/… 我很好奇为什么这个问题仍然关闭。这是一个合理的问题,有很好的工作答案。投票重新开放。 【参考方案1】:

实现可能是这样的

public static String sha256_hash(String value) 
  StringBuilder Sb = new StringBuilder();

  using (SHA256 hash = SHA256Managed.Create()) 
    Encoding enc = Encoding.UTF8;
    Byte[] result = hash.ComputeHash(enc.GetBytes(value));

    foreach (Byte b in result)
      Sb.Append(b.ToString("x2"));
  

  return Sb.ToString();

编辑: Linq 实现更简洁,但可能可读性较差

public static String sha256_hash(String value) 
  using (SHA256 hash = SHA256Managed.Create()) 
    return String.Concat(hash
      .ComputeHash(Encoding.UTF8.GetBytes(value))
      .Select(item => item.ToString("x2")));
  
 

编辑 2: .NET Core 、.NET5、.NET6 ...

public static String sha256_hash(string value)

    StringBuilder Sb = new StringBuilder();

    using (var hash = SHA256.Create())            
    
        Encoding enc = Encoding.UTF8;
        byte[] result = hash.ComputeHash(enc.GetBytes(value));

        foreach (byte b in result)
            Sb.Append(b.ToString("x2"));
    

    return Sb.ToString();

【讨论】:

如何将哈希解密回密码? @daniel metlitski:你不能:散列是单向函数,你可以计算散列但不能取回参数。注册新用户时,存储的不是密码而是哈希值;在身份验证时,计算所提供密码的哈希值并将哈希值与存储的哈希值进行比较。 @JuliusHolmberg: 你必须 1. 分配资源 (using), 2. 处理bytes: EncodingGetBytes 3.将结果表示为 string - StringBuilderToString("x2") string.Join 也许? string.Concat 更短,更易读:只是 concat 没有任何分隔符【参考方案2】:

这是 .net 核心中更好/更整洁的方式:

public static string sha256_hash( string value )

  using var hash = SHA256.Create();
  var byteArray = hash.ComputeHash( Encoding.UTF8.GetBytes( value ) );
  return Convert.ToHexString( byteArray ).ToLower();

【讨论】:

【参考方案3】:

我正在寻找一个在线解决方案,并且能够从 Dmitry 的回答中编译以下内容:

public static String sha256_hash(string value)

    return (System.Security.Cryptography.SHA256.Create()
            .ComputeHash(Encoding.UTF8.GetBytes(value))
            .Select(item => item.ToString("x2")));

【讨论】:

这个实现对我来说似乎是错误的。该选择返回IEnumerable<string>。而且你复制粘贴了一个糟糕的命名约定。 这实际上是缺少一个函数调用的最佳答案。这对我有用: return String.Concat((System.Security.Cryptography.SHA256.Create() .ComputeHash(Encoding.UTF8.GetBytes(value)) .Select(item => item.ToString("x2") ))); 我喜欢它,因为它是单行的,本身不需要函数。

以上是关于获取字符串的SHA-256字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 SHA-256 获得字符串后的错误结果 [重复]

hmac-sha256 2021-11-02

如何解密 SHA-256 加密字符串?

如何在Mason代码中创建字符串的SHA-256哈希?

SHA-256 的消息大小是不是有限制?

使用 MD5 或 sha-256 C# 散列密码