【问题标题】:Code example for C# and Javascript SHA256 hashingC# 和 Javascript SHA256 散列的代码示例
【发布时间】: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


【解决方案1】:

这是解决方案,我真的希望这可以帮助其他处于相同情况的人。

在html文件中,加载crypto-js库

<!-- library for doing password hashing, base64 eoncoding / decoding -->
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/core-min.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64-min.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/sha256.js"></script>

在javascript中,执行以下操作

// This function takes a base64 string, hashes it with the SHA256 algorithm
// and returns a base64 string. 
function hashBase64StringAndReturnBase64String(str)
{
    // Take the base64 string and parse it into a javascript variable
    var words  = CryptoJS.enc.Base64.parse(str);
    // Create the hash using the CryptoJS implementation of the SHA256 algorithm
    var hash = CryptoJS.SHA256(words);
    var outString =  hash.toString(CryptoJS.enc.Base64)
    // Display what you just got and return it
    console.log("Output string is: " + outString);
    return outString;
}

【讨论】:

  • 谢谢,马尔伯。所有这些 Google 链接现在都转到 404。我正在尝试查找新的 URL,但遇到了问题。如果其他人知道它们是什么,我一定会很感激的。
  • 我尝试使用您的代码 sn-p 但我得到 CryptoJS is not defined 错误。可能是什么原因?
  • cryptoJS 可能搬到别处
【解决方案2】:

检查以下 URL 上的 Java 脚本 SHA256 实现 http://www.movable-type.co.uk/scripts/sha256.html

【讨论】:

  • 谢谢萨达姆。我已经查看了那个 URL,我得到了与使用 CryptoJS 相同的结果,即 var hash = CryptoJS.SHA256(stringToHash); console.log("b64" + hash.toString(CryptoJS.enc.Base64));但是,生成的字符串与使用 C# 获得的字符串不匹配。我担心这两种算法都依赖于输入字符串:鉴于我需要将零填充到使用原始字符串获得的字节数组中,我宁愿使用字节。
猜你喜欢
  • 1970-01-01
  • 2015-04-12
  • 2015-12-14
  • 2023-03-24
  • 1970-01-01
  • 2021-02-18
  • 2015-01-23
  • 2011-08-10
  • 2014-01-26
相关资源
最近更新 更多