SHA1:将javascript实现转换为c#
我正在尝试使用c#客户端登录。有一个步骤涉及从用户名和密码创建sha1哈希(,第203行): 这将调用(,第113行) str2blks_SHA1()的定义(,第28行)为 在javascript和.net中使用相同的用户名和密码,似乎会产生不同的结果 然后我尝试将str2blks_SHA1()函数移植到c#,但我不明白如何创建字节数组(BLK)(SHA1CryptoServiceProvider.ComputeHash()需要),因为BLK中的每个数组项似乎都可能大于一个字节(只需查看str.length*8)) 那么,是否已经有一些SHA1实现可以做与此javascript实现相同的事情?或者,如果我真的需要自己实现它,我如何移植str2blks_SHA1()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.
谢谢您是否尝试过设置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"))));