【发布时间】:2012-11-29 01:12:03
【问题描述】:
我有一个在服务器端运行的 C# 算法,它对 base64 编码的字符串进行哈希处理。
byte[] salt = Convert.FromBase64String(serverSalt); // Step 1
SHA256Managed sha256 = new SHA256Managed(); // Step 2
byte[] hash = sha256.ComputeHash(salt); // Step 3
Echo("String b64: " + Convert.ToBase64String(hash)); // Step 4
然后根据哈希的数据库列表检查哈希。 我很想用 javascript 实现同样的效果,使用 serverSalt,因为它是通过 websocket 从 C# 传输的。
我知道SHA-256 hashes different between C# and Javascript,因为 C# 和 Javascript 有不同的字符串编码。 但我知道我可以在字节数组中填充零以使 Javascript 表现得像 C#(上面的步骤 1 已解决)。
var newSalt = getByteArrayFromCSharpString(salt); // Pad zeros where needed
function getByteArrayFromCSharpString(inString)
{
var bytes = [];
for (var i = 0; i < inString.length; ++i)
{
bytes.push(inString.charCodeAt(i));
bytes.push(0);
}
return bytes;
}
谁能提供一些关于我可以使用哪些算法来重现步骤 2、3 和 4 的见解?
PS:周围已经有问题和答案,但没有一个代码sn-p。
【问题讨论】:
-
“我知道 C# 和 Javascript 中的字节数组会有所不同” 使用二进制数据/base64 时,情况并非如此。唯一的区别是字符串和字节之间的默认转换。两者都使用 UTF-8 或 UTF-16,不要用零填充。
-
“我知道来自 C# 和 Javascript 的字节数组会有所不同”是我最初的问题,几秒钟后编辑了:) 你很快!我的意思是 C# 和 Javascript 中的相同字符串会产生不同的字节数组。一旦字节数组在两者中相同(步骤 1),算法(步骤 2)应该产生相同的散列字节数组(步骤 3)。然后,我可以将两者都转换为 base64(步骤 4)。我希望对步骤 2-4 有一些见解,周围有很多建议,但没有代码可言。
-
使用 base64 时,从字符串到字节的转换对于 C# 和 Javascript 都是一样的。您所说的差异仅适用于文本,即使那样它也已损坏。
-
感谢 CodesInChaos,我设法对其进行了整理,您对 b64 字节转换绝对正确:它在 C# 和 Javascript 中是相同的
-
“这非常适合散列凭据的安全客户端-服务器通信” 散列凭据的通信通常是一种不好的方法,它不会提高明文通信的安全性,有时甚至会降低安全性。但是没有细节我不能告诉你太多,只是没有这样的方案可以取代 web 应用程序的 SSL。 使用 SSL.
标签: c# javascript base64 sha