我怎样才能用C#写一个字符串?
我试图写一个函数来获取一个字符串,然后像这样做我怎样才能用C#写一个字符串?,c#,hash,C#,Hash,我试图写一个函数来获取一个字符串,然后像这样做 public string SHA512(string input) { string hash; ~magic~ return hash; } 魔法应该是什么?我不知道你为什么期待128 一个字节中有8位。64字节。8*64=512位散列。512/8=64,因此64确实是正确的大小。也许您希望在SHA512算法之后将其转换为十六进制 另请参见: SHA512Managed算法的哈希大小为512位。您的代码是正确
public string SHA512(string input)
{
string hash;
~magic~
return hash;
}
魔法应该是什么?我不知道你为什么期待128
一个字节中有8位。64字节。8*64=512位散列。
512/8=64
,因此64确实是正确的大小。也许您希望在SHA512算法之后将其转换为十六进制
另请参见:SHA512Managed算法的哈希大小为512位。您的代码是正确的,但您应该处理SHA512Managed实例:
using (SHA512 shaM = new SHA512Managed())
{
hash = shaM.ComputeHash(data);
}
512位是64字节
要将字符串转换为字节数组,需要指定编码。如果要创建哈希代码,可以使用UTF8:
var data = Encoding.UTF8.GetBytes("text");
using (...
您可以使用System.Security.Cryptography.SHA512类 下面是一个示例,来自MSDN的straigt
byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA512 shaM = new SHA512Managed();
result = shaM.ComputeHash(data);
这来自我的一个项目:
public static string SHA512(string input)
{
var bytes = System.Text.Encoding.UTF8.GetBytes(input);
using (var hash = System.Security.Cryptography.SHA512.Create())
{
var hashedInputBytes = hash.ComputeHash(bytes);
// Convert to text
// StringBuilder Capacity is 128, because 512 bits / 8 bits in byte * 2 symbols for byte
var hashedInputStringBuilder = new System.Text.StringBuilder(128);
foreach (var b in hashedInputBytes)
hashedInputStringBuilder.Append(b.ToString("X2"));
return hashedInputStringBuilder.ToString();
}
}
请注意:
除了使用System.Security.Cryptography的WinCrypt API,您还可以使用BouncyCastle:
public static byte[] SHA512(string text)
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(text);
Org.BouncyCastle.Crypto.Digests.Sha512Digest digester = new Org.BouncyCastle.Crypto.Digests.Sha512Digest();
byte[] retValue = new byte[digester.GetDigestSize()];
digester.BlockUpdate(bytes, 0, bytes.Length);
digester.DoFinal(retValue, 0);
return retValue;
}
如果需要HMAC版本(将身份验证添加到哈希)
您可以尝试以下几行:
public static string GenSHA512(string s, bool l = false)
{
string r = "";
try
{
byte[] d = Encoding.UTF8.GetBytes(s);
using (SHA512 a = new SHA512Managed())
{
byte[] h = a.ComputeHash(d);
r = BitConverter.ToString(h).Replace("-", "");
}
r = (l ? r.ToLowerInvariant() : r);
}
catch
{
}
return r;
}
public static string ToSha512(this string inputString)
{
if (string.IsNullOrWhiteSpace(inputString)) return string.Empty;
using (SHA512 shaM = new SHA512Managed())
{
return Convert.ToBase64String(shaM.ComputeHash(Encoding.UTF8.GetBytes(inputString)));
}
}
是的,你完全正确。我只是用一个在线生成器与之进行比较,它生成了十六进制。谢谢:)链接不会将字符串转换为字节数组,而是将十六进制字符串转换为字节。要将字符串转换为字节数组,请使用类似于
Encoding.UTF8.GetByteCount(“text”)
@CarstenSchütte的东西。嗯,UTF-8用于文本编码,这与此问题无关。不管怎样,GetByteCount都不会将字符串转换为字节数组。它只能得到字节数组的长度。@CarstenSchütte哦,等等。我想我知道你的意思。你说的是获取初始“数据”变量,对吗?在这种情况下,是的,UTF-8可以。尽管如此,GetByteCount仍然不是合适的函数。@luiscubal:对不起,GetByteCount是我的错(复制/粘贴错误)。当然,您需要使用GetBytes()来获取数据。无论以何种方式都不使用dispose的示例数量之多令人震惊。使用using
显示惯用方式值得称赞。与其使用var data=Encoding.UTF8.GetByteCount(foo)
,不如使用var data=Encoding.UTF8.GetBytes(foo)
。为什么需要“using”子句?默认的C#垃圾收集是否会启动并删除shaM变量?为什么需要这样的显式垃圾收集?不要将垃圾收集和释放/处置未使用的非托管对象混为一谈。使用“Using”确保在Using块结束时调用Dispose。这将释放非托管资源—否则,当GC清理对象(并在内部调用终结器)时,它们将被释放。SHA512管理的类是一次性的,所以我更喜欢使用。有关Dispose模式的更多信息,请查看StringBuilder代码,该代码可以替换为一行“var hash=BitConverter.ToString(hashedInputBytes).Replace(“-”,”);”什么是BouncyCastle?@MikaelDúiBolinder:Bouncy Castle Crypto API由澳大利亚慈善机构Bouncy Castle Inc.军团负责,该机构负责照顾和喂养Bouncy Castle API。
public static string GenSHA512(string s, bool l = false)
{
string r = "";
try
{
byte[] d = Encoding.UTF8.GetBytes(s);
using (SHA512 a = new SHA512Managed())
{
byte[] h = a.ComputeHash(d);
r = BitConverter.ToString(h).Replace("-", "");
}
r = (l ? r.ToLowerInvariant() : r);
}
catch
{
}
return r;
}
public static string ToSha512(this string inputString)
{
if (string.IsNullOrWhiteSpace(inputString)) return string.Empty;
using (SHA512 shaM = new SHA512Managed())
{
return Convert.ToBase64String(shaM.ComputeHash(Encoding.UTF8.GetBytes(inputString)));
}
}