Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SHA1:将javascript实现转换为c#_Javascript_.net_Hash_Sha1 - Fatal编程技术网

SHA1:将javascript实现转换为c#

SHA1:将javascript实现转换为c#,javascript,.net,hash,sha1,Javascript,.net,Hash,Sha1,我正在尝试使用c#客户端登录。有一个步骤涉及从用户名和密码创建sha1哈希(,第203行): 这将调用(,第113行) str2blks_SHA1()的定义(,第28行)为 在javascript和.net中使用相同的用户名和密码,似乎会产生不同的结果 然后我尝试将str2blks_SHA1()函数移植到c#,但我不明白如何创建字节数组(BLK)(SHA1CryptoServiceProvider.ComputeHash()需要),因为BLK中的每个数组项似乎都可能大于一个字节(只需查看str.

我正在尝试使用c#客户端登录。有一个步骤涉及从用户名和密码创建sha1哈希(,第203行):

这将调用(,第113行)

str2blks_SHA1()的定义(,第28行)为

在javascript和.net中使用相同的用户名和密码,似乎会产生不同的结果

然后我尝试将str2blks_SHA1()函数移植到c#,但我不明白如何创建字节数组(BLK)(SHA1CryptoServiceProvider.ComputeHash()需要),因为BLK中的每个数组项似乎都可能大于一个字节(只需查看str.length*8))

那么,是否已经有一些SHA1实现可以做与此javascript实现相同的事情?或者,如果我真的需要自己实现它,我如何移植str2blks_SHA1()


谢谢

您是否尝试过设置SHA1的InputBlockSize或OutputBlockSize?

此JavaScript实现看起来像是来自的标准SHA-1填充算法。我从运行中获得相同的结果(忽略细微的格式差异):

// JavaScript
calcSHA1("username@example.com:p4ssw0rd");
正如我从:

// C#
using (SHA1 hash = SHA1.Create())
    Console.WriteLine(BitConverter.ToString(
        hash.ComputeHash(Encoding.ASCII.GetBytes("username@example.com:p4ssw0rd"))));
您提供了哪些数据,得到了哪些(不同的)结果


(请注意,如果您的用户名或密码包含非ASCII字符,JavaScript生成与C#不同的结果并不奇怪,因为它似乎没有进行正确的UTF-8转换;特别是,它似乎假设每个字符只有一个字节。)

如果可能的话,您不应该实现自己的加密例程。有太多可能的侧通道攻击,你几乎肯定会失去加密安全性。你是对的,它确实有效。我试图用一个大整数来比较结果;ComputeHash()的字节数组结果必须在传递给BigInteger的构造函数之前反转,然后两个结果匹配。隐马尔可夫模型。。。我说的对吗?必须反转的是字节数组,而不是javascript版本中的字符串?(也就是说,为了确保BigInteger.ModPow()和所有这些东西的所有功能都正常工作)如果您想将SHA-1输出作为160位的数字处理,通常需要以big-endian顺序对其进行解释。由于构造的BigInteger被记录为采用小尾端顺序的字节数组,因此正确的说法是,为了使BigInteger具有所需的值,需要反转的是C#字节数组。
/*
 * Convert a string to a sequence of 16-word blocks, stored as an array.
 * Append padding bits and the length, as described in the SHA1 standard.
 */
function str2blks_SHA1(str)
{
  var nblk = ((str.length + 8) >> 6) + 1;
  var blks = new Array(nblk * 16);
  for(var i = 0; i < nblk * 16; i++) blks[i] = 0;
  for(i = 0; i < str.length; i++)
    blks[i >> 2] |= str.charCodeAt(i) << (24 - (i % 4) * 8);
  blks[i >> 2] |= 0x80 << (24 - (i % 4) * 8);
  blks[nblk * 16 - 1] = str.length * 8;
  return blks;
}
SHA1CryptoServiceProvider.ComputeHash(Encoding.UTF8.GetBytes(userName + ":" + password))
// JavaScript
calcSHA1("username@example.com:p4ssw0rd");
// C#
using (SHA1 hash = SHA1.Create())
    Console.WriteLine(BitConverter.ToString(
        hash.ComputeHash(Encoding.ASCII.GetBytes("username@example.com:p4ssw0rd"))));