我怎样才能用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();
    }
}
请注意:

  • SHA512对象被释放(“使用”部分),因此我们没有任何资源泄漏
  • StringBuilder用于高效的十六进制字符串构建

  • 除了使用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)));
            }
    }