【问题标题】:C# SHA-2 (512) Base64 encoded hashC# SHA-2 (512) Base64 编码哈希
【发布时间】:2011-04-14 15:33:16
【问题描述】:

寻找一种在 C# 中从字符串执行以下操作的方法。

public static String sha512Hex(byte[] data)

计算 SHA-512 摘要并将值作为十六进制字符串返回。

参数: data - 要消化的数据 回报: SHA-512 摘要为十六进制字符串

    private static string GetSHA512(string text)
    {
        UnicodeEncoding UE = new UnicodeEncoding();
        byte[] hashValue;
        byte[] message = UE.GetBytes(text);
        SHA512Managed hashString = new SHA512Managed();
        string encodedData = Convert.ToBase64String(message);
        string hex = "";
        hashValue = hashString.ComputeHash(UE.GetBytes(encodedData));
        foreach (byte x in hashValue)
        {
            hex += String.Format("{0:x2}", x);
        }
        return hex;
    }

【问题讨论】:

    标签: c# encryption


    【解决方案1】:

    让这个工作。取自here,稍作修改。

        public static string CreateSHAHash(string Phrase)
        {
            SHA512Managed HashTool = new SHA512Managed();
            Byte[] PhraseAsByte = System.Text.Encoding.UTF8.GetBytes(string.Concat(Phrase));
            Byte[] EncryptedBytes = HashTool.ComputeHash(PhraseAsByte);
            HashTool.Clear();
            return Convert.ToBase64String(EncryptedBytes);
        }
    

    【讨论】:

    • 返回的不是“十六进制字符串”而是base64编码的字符串。
    【解决方案2】:

    System.Security.Cryptography.SHA512 是您需要的吗?

    var alg = SHA512.Create();
    alg.ComputeHash(Encoding.UTF8.GetBytes("test"));
    BitConverter.ToString(alg.Hash).Dump();
    

    LINQPad 执行产生:

    EE-26-B0-DD-4A-F7-E7-49-AA-1A-8E-E3-C1-0A-E9-92-3F-61-89-80-77-2E-47-3F -88-19-A5-D4-94-0E-0D-B2-7A-C1-85-F8-A0-E1-D5-F8-4F-88-BC-88-7F-D6-7B-14-37 -32-C3-04-CC-5F-A9-AD-8E-6F-57-F5-00-28-A8-FF

    根据您的问题创建方法:

    public static string sha512Hex(byte[] data)
    {
        using (var alg = SHA512.Create())
        {
            alg.ComputeHash(data);
            return BitConverter.ToString(alg.Hash);
        }
    }
    

    【讨论】:

    • 没有像我希望的那样工作。文档说明我需要将字符串转换为“SHA-2 (512) Base64 编码哈希”
    • 是的,好的,我没有仔细阅读标题,您也应该在问题中提及“-2”部分。不知道 .NET 中是否有 SHA-2 512 位实现,但可能是。
    • 您确定 SHA512 不是 SHA-2?其他网站声明它是 SHA-2 512 位。
    • 你有预定义输入和输出的测试用例吗?
    • 这不是十六进制输出......它已经以某种方式编码。您需要更好的文档。
    【解决方案3】:

    更好的内存管理:

        public static string SHA512Hash(string value)
        {
            byte[] encryptedBytes;
    
            using (var hashTool = new SHA512Managed())
            {
                encryptedBytes = hashTool.ComputeHash(System.Text.Encoding.UTF8.GetBytes(string.Concat(value)));
                hashTool.Clear();
            }
    
            return Convert.ToBase64String(encryptedBytes);
        }
    

    【讨论】:

    • 返回的不是“十六进制字符串”而是base64编码的字符串。
    猜你喜欢
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多