我想将此 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();
}
两种情况的结果不同,我的代码有什么问题?
代码中存在很多问题。正如评论中已经指出的,拥有“众所周知”的编码以及一致的大小写很重要。在许多情况下,人们可以逃脱惩罚,但哈希函数会产生意想不到的结果。此外,请注意,.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