に翻訳していますhttps://www.interactivebrokers.com/sso/LoginにC#クライアントを使用してログインしようとしています。この呼び出しSHA1:JavaScriptの実装をC#
innerHash = CalcSHA1(username + ":" + password);
(https://www.interactivebrokers.com/sso/Templates/javascript/sha1.js、ライン113)
calcSHA1Blks(str2blks_SHA1(str);
とstr2blks_SHA1()が定義されている(:ユーザー名&パスワードからsha1ハッシュを作成する必要がステップ(https://www.interactivebrokers.com/sso/Templates/javascript/myxyz.js、ライン203)があります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()内で自動的に行われる標準のものである場合、または明示的に行う必要がある場合は、 JavaScriptでと.NETで同じユーザー名&パスワードを使用して
SHA1CryptoServiceProvider.ComputeHash(Encoding.UTF8.GetBytes(userName + ":" + password))
を、そして、異なる結果を生成するようだ:私が試してみました。
次に、str2blks_SHA1()関数をC#に移植しようとしましたが、各配列アイテムのように見えるバイト配列(blks)(SHA1CryptoServiceProvider.ComputeHash()が必要です)を作成する方法を理解できません。 blksは1バイトより大きくなる可能性があります(ちょうどstr.length * 8を見ています)...
したがって、このJavaScript実装と同じことをするSHA1実装は既に存在しますか?または、私が実際にこれを実装する必要がある場合、str2blks_SHA1()を移植するにはどうすればよいですか?
おかげ
可能であれば、独自の暗号化ルーチンを実装しないでください。暗号化セキュリティを失う可能性が非常に高いサイドチャネル攻撃がたくさんあります。 – templatetypedef