将生成哈希的代码从 CryptoJS 转换为 C#

问题描述 投票:0回答:1

我想将此 JS 代码转换为 C# 以在 ASP.NET 应用程序中使用它。

JavaScript 代码:

var to_md5 = "Some Text Here"
var hash = CryptoJS.SHA1(CryptoJS.MD5(to_md5.toUpperCase()).toString());
var result = CryptoJS.enc.Hex.stringify(hash);
console.log(result);

我在 C# 中尝试了以下方法:

var to_md5 = "Some Text Here".ToUpper();
var hashString = gSHA1(gMD5(to_md5));

private string gMD5(string input)
{
    MD5 md5 = MD5.Create();
    Byte[] inputBytes = Encoding.ASCII.GetBytes(input);
    Byte[] hash = md5.ComputeHash(inputBytes);

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < hash.Length; i++)
    {
        sb.Append(hash[i].ToString("X2"));
    }
    return sb.ToString();
}

private string gSHA1(string s)
{
    Byte[] bytes = Encoding.UTF8.GetBytes(s);
    var sha1 = SHA1.Create();
    Byte[] hashBytes = sha1.ComputeHash(bytes);
    return HexStringFromBytes(hashBytes);
}

private string HexStringFromBytes(Byte[] bytes)
{
    var sb = new StringBuilder();
    foreach (byte b in bytes)
    {
        var hex = b.ToString("x2");
        sb.Append(hex);
    }
    return sb.ToString();
}

两种情况的结果不同,我的代码有什么问题?

javascript c# cryptojs
1个回答
0
投票

代码中存在很多问题。正如评论中已经指出的,拥有“众所周知”的编码以及一致的大小写很重要。在许多情况下,人们可以逃脱惩罚,但哈希函数会产生意想不到的结果。此外,请注意,.NET 加密类通常实现 IDisposable

,因此如果您不想冒内存/资源泄漏的风险,则需要与适当的 
using 语句一起实例化(或手动清理)。
最后,关于正确使用加密货币的注意事项:

MD5 和 SHA1 都不再被认为是最先进的,并且仅应用于与旧应用程序的兼容性。链接它们并不能提供某种神奇的安全保证。此外,如前所述,链接两个哈希函数并在其间进行片状字节-十六进制-字节转换是危险的,可能会导致意外错误甚至安全问题。在加密基元之间传递内容时,最好坚持使用原始字节数组。

如果这是一个新项目,而不是旧遗留应用程序的端口,我建议使用 SHA2 或 SHA3 等现代哈希函数,并避免手动哈希链接,即使这不是与安全相关的代码。

为了完整起见,固定程序:

using System.Security.Cryptography; using System.Text; var toMd5 = "Some Text Here".ToUpper(); var hashString = ComputeSHA1(ComputeMD5(toMd5)); Console.WriteLine(hashString); string ComputeMD5(string input) { using var md5 = MD5.Create(); byte[] inputBytes = Encoding.UTF8.GetBytes(input); byte[] hash = md5.ComputeHash(inputBytes); return HexStringFromBytes(hash); } string ComputeSHA1(string input) { using var sha1 = SHA1.Create(); byte[] inputBytes = Encoding.UTF8.GetBytes(input); byte[] hash = sha1.ComputeHash(inputBytes); return HexStringFromBytes(hash); } string HexStringFromBytes(byte[] bytes) { var sb = new StringBuilder(); foreach (byte b in bytes) sb.Append(b.ToString("x2")); return sb.ToString(); }

...输出与 JavaScript 代码相同的哈希值:
6a2b72d89102c35d34bd2981a3a863b18e647da8


© www.soinside.com 2019 - 2024. All rights reserved.