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

Dar*_*ari 37 c# string hash sha256

我有一些string,我想用使用C#的SHA-256哈希函数来哈希它.我想要这样的东西:

 string hashString = sha256_hash("samplestring");
Run Code Online (Sandbox Code Playgroud)

框架中是否有内置功能可以执行此操作?

Dmi*_*nko 103

实施可能就是这样

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

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

编辑2: .NET Core

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

  • @daniel metlitski:你*不能*:hash是*单向函数*,你可以计算哈希但无法获取参数.注册新用户时,不存储密码,而是存储其哈希值; 在身份验证上,计算所提供密码的哈希值,并将哈希值与存储的哈希值进行比较. (13认同)
  • 我不建议使用简单的哈希来存储密码。实际上只需使用具有存储密码(如身份)逻辑的库即可。即使您无法“解密”回来,您也可以使用字典攻击,对数百万个哈希值已知的常见密码进行攻击。为了避免这种情况,你需要使用哈希+盐。您还需要安全地储存盐。在安全方面,可能还有比我所缺少的更多的东西。请使用库而不是尝试自己存储密码。 (3认同)
  • 你如何将哈希解密回密码? (2认同)

小智 20

从 .NET 5 开始,您可以使用新Convert.ToHexString方法将哈希字节数组转换为(十六进制)字符串,而无需使用 orStringBuilder.ToString("X0")​​:

public static string HashWithSHA256(string value)
{
  using var hash = SHA256.Create();
  var byteArray = hash.ComputeHash(Encoding.UTF8.GetBytes(value));
  return Convert.ToHexString(byteArray);
}
Run Code Online (Sandbox Code Playgroud)