繁体   English   中英

SHA1:将javascript实现转换为c#

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM