c# - HMACSHA256 在计算哈希时忽略零

标签 c# c#-4.0 cryptography hash

我使用 Crypto-JS v2.5.3 (hmac.min.js) http://code.google.com/p/crypto-js/计算客户端哈希的库和脚本是:

$("#PasswordHash").val(Crypto.HMAC(Crypto.SHA256, $("#pwd").val(), $("#PasswordSalt").val(), { asByte: true }));

这会返回这样的东西:

b3626b28c57ea7097b6107933c6e1f24f586cca63c00d9252d231c715d42e272

然后在服务器端我使用下面的代码来计算哈希值:

private string CalcHash(string PlainText, string Salt) {
        string result = "";
        ASCIIEncoding enc = new ASCIIEncoding();
        byte[]
        baText2BeHashed = enc.GetBytes(PlainText),
        baSalt = enc.GetBytes(Salt);
        System.Security.Cryptography.HMACSHA256 hasher = new HMACSHA256(baSalt);
        byte[] baHashedText = hasher.ComputeHash(baText2BeHashed);
        result = string.Join("", baHashedText.ToList().Select(b => b.ToString("x")).ToArray());
        return result;
    }

此方法返回:

b3626b28c57ea797b617933c6e1f24f586cca63c0d9252d231c715d42e272

如您所见,服务器端方法只忽略了一些零字符。哪里有问题?我的服务器端方法有什么问题吗?我只需要这两个值与相同的字符串和盐相同。

最佳答案

As you see there is just some zero characters that the server side method ignore that. where is the problem?

此处 - 在 C# 中转换为十六进制:

b => b.ToString("x")

如果 b 是 10,那只会给出“a”而不是“0a”。

我个人建议使用更简单的十六进制转换:

return BitConverter.ToString(baHashedText).Replace("-", "").ToLowerInvariant();

(您可以只是将 "x" 更改为 "x2",以指定 2 个字符的长度,但它仍然是一个执行字节到十六进制转换的某种迂回方式。)

关于c# - HMACSHA256 在计算哈希时忽略零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12049395/

相关文章:

c# - 使用 C# 从存储在 azure blob 存储上的 200gb 文本文件中读取一行

c# - 如何在 C# 中找出并防止死锁

node.js - 这是在 Node JS 中生成随机数的加密安全方法吗?

c# - 如何更改.Net core中的访问拒绝路由

c# - Thread.CurrentCulture 未保存到实例变量?

c# - EFCore 中的 Npgsql 无法翻译 DateTimeOffset.Date

c# - 如何为MYSQL数据库中的每个名称动态添加标签?

c#-4.0 - 从 .NET 缓存获取最多信息

java - 请评论对称加密中密码 block 链接(CBC)的数据大小

java - 使用 Java 加密会导致 NoSuchAlgorithmException