获取字符串的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
: Encoding
和GetBytes
3.将结果表示为 string
- StringBuilder
和 ToString("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字符串的主要内容,如果未能解决你的问题,请参考以下文章