gpt4 book ai didi

字节数组的十六进制表示

转载 作者:行者123 更新时间:2023-12-04 15:36:02 25 4
gpt4 key购买 nike

问这个我觉得很愚蠢,但因为我不知道答案,所以我还是要继续。
我正在尝试一些身份验证代码并想知道为什么我从 Rfc2898DeriveBytes 获得的字节数组需要转换为十六进制并再次返回到字节数组才能正确初始化我的 HMACSHA1 对象。我觉得我在做一些愚蠢的事情,或者只是遗漏了一些明显的东西。
我的客户端代码是一个基于crypto-js的javascript函数;

var key256bit = Crypto.PBKDF2(passwordEntered, saltBytes, 32, { iterations: 1000 }); 
var hmacBytes = Crypto.HMAC(Crypto.SHA1, url, key256bit, { asBytes: true });
var base64Hash = Crypto.util.bytesToBase64(hmacBytes);
我的服务器端代码如下;
    Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password,
encoding.GetBytes(salt), 1000);
byte[] key = rfc2898.GetBytes(32);

// Don't think I should need to do this.
// However, it wont work if I initialise HMACSHA1
// with the rfc2898.GetBytes(32)
string test = ByteArrayToString(key);

HMACSHA1 hmacSha1 = new HMACSHA1(encoding.GetBytes(test));

byte[] computedHash = hmacSha1.ComputeHash(encoding.GetBytes(requestUri));
string computedHashString = Convert.ToBase64String(computedHash);
我从网上获取的 ByteArrayToString 方法是;
private static string ByteArrayToString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
hex.AppendFormat("{0:x2}", b);
return hex.ToString();
}
所以我可以看到我从我对 rfc2898.GetBytes(32) 的调用中得到了 32 个字节。 .我使用 ByteArrayToString 方法将其转换为 HEX,以确认它与我在 Javascript 变量 key256bit 中看到的相匹配。现在我的测试变量是一个长度为 64 的字符串,当我使用 encoding.GetBytes(test) 将它传递给 HMACSHA1 的构造函数时,它是一个长度为 64 的字节数组。
crypto-js 上的 doco 有点缺乏,但我认为调用 Crypto.PBKDF2 的参数为 32 并且它正在创建一个 32 字节长(或 256 位)的 key 。
任何澄清都非常感谢。

最佳答案

我怀疑这是问题的根源,在 PBKDF2.js :

return options && options.asBytes ? derivedKeyBytes :
options && options.asString ? Binary.bytesToString(derivedKeyBytes) :
util.bytesToHex(derivedKeyBytes);

因为您还没有为 asBytes 提供选项或 asString ,它将 key 转换为十六进制表示 - 就像您的 C# 代码所做的那样。因此,目前您使用的是 512 位 key ,正是因为您从“原始 key ”的每个字节生成 2 个字节的“使用过的 key ”。

我怀疑如果您指定 asBytes选项,它只会在 C# 代码中没有额外的十六进制部分的情况下工作。

再说一次,我以前从未见过 PBKDF2,所以我可能离基地很远......

关于字节数组的十六进制表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9990064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com