[英]SHA1: translating javascript implementation to c#
我正在尝试使用ac#客户端登录https://www.interactivebrokers.com/sso/Login 。 有一个步骤涉及从用户名和密码创建sha1哈希( https://www.interactivebrokers.com/sso/Templates/javascript/myxyz.js ,第203行):
innerHash = CalcSHA1(username + ":" + password);
这会调用( https://www.interactivebrokers.com/sso/Templates/javascript/sha1.js ,第113行)
calcSHA1Blks(str2blks_SHA1(str);
并且str2blks_SHA1()定义为( https://www.interactivebrokers.com/sso/Templates/javascript/sha1.js ,第28行)为
/*
* 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;
}
我对SHA1东西不是很熟悉,所以我无法确定str2blks_SHA1()中的内容是否是在.net的SHA1CryptoServiceProvider.ComputeHash()中自动完成的标准内容,还是我需要显式地执行。 我试过了:
SHA1CryptoServiceProvider.ComputeHash(Encoding.UTF8.GetBytes(userName + ":" + password))
在javascript和.net中使用相同的用户名和密码,似乎会产生不同的结果。
然后我尝试将str2blks_SHA1()函数移植到c#,但是我不明白如何创建字节数组(blks)(SHA1CryptoServiceProvider.ComputeHash()要求),因为似乎blks中的每个数组项都可能是大于一个字节(仅查看str.length * 8))...
那么,已经有一些SHA1实现与此javascript实现具有相同的功能吗? 或者,如果真的需要自己实现此功能,该如何移植str2blks_SHA1()?
谢谢
此JavaScript实现类似于RFC 3174中的标准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转换;具体地说,似乎假设每个字符只是一个字节。)
您是否尝试设置SHA1的InputBlockSize或OutputBlockSize?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.