1

JavaScript関数で.netメンバーシッププロバイダーから同じhmacsha1ハッシュとbase64エンコーディングを再現しようとしています。crypto-js を使用してみましたが、異なる結果が得られています。.net コードは、"test" を "W477AMlLwwJQeAGlPZKiEILr8TA=" にハッシュします。

ここに.netコードがあります

string password = "test";
HMACSHA1 hash = new HMACSHA1();
hash.Key = Encoding.Unicode.GetBytes(password);
string encodedPassword = Convert.ToBase64String(hash.ComputeHash(Encoding.Unicode.GetBytes(password)));

そして、これは、同じ出力を生成しないcrypto-jsを使用して試したjavascriptメソッドです

var hash = CryptoJS.HmacSHA1("test", "");
var encodedPassword = CryptoJS.enc.Base64.stringify(hash);

.net から生成されたハッシュと一致するように JavaScript ハッシュを取得するにはどうすればよいですか。

4

2 に答える 2

1
//not sure why crypt-js's utf16LE function doesn't give the same result
//words = CryptoJS.enc.Utf16LE.parse("test");
//utf16 = CryptoJS.enc.Utf16LE.stringify("test");

function str2rstr_utf16le(input) {
  var output = [],
      i = 0,
      l = input.length;

  for (; l > i; ++i) {
    output[i] = String.fromCharCode(
      input.charCodeAt(i)        & 0xFF,
      (input.charCodeAt(i) >>> 8) & 0xFF
    );
  }

  return output.join('');
}

var pwd = str2rstr_utf16le("test");
var hash = CryptoJS.HmacSHA1(pwd, pwd);

var encodedPassword = CryptoJS.enc.Base64.stringify(hash);
alert(encodedPassword);
于 2013-01-11T02:22:16.450 に答える
0

.NET ではキーを指定しません。

var secretKey = "";
var password = "test";

var enc = Encoding.ASCII;
System.Security.Cryptography.HMACSHA1 hmac = new System.Security.Cryptography.HMACSHA1(enc.GetBytes(secretKey));
hmac.Initialize();

byte[] buffer = enc.GetBytes(password);
var encodedPassword = Convert.ToBase64String(hmac.ComputeHash(buffer));

編集: @Andreas が述べたように、問題はエンコーディングです。したがって、独自のコードで UTF を ANSI に置き換えるだけで済みます。

string password = "test";
System.Security.Cryptography.HMACSHA1 hash = new System.Security.Cryptography.HMACSHA1();
hash.Key = Encoding.ASCII.GetBytes("");
string encodedPassword = Convert.ToBase64String(hash.ComputeHash(Encoding.ASCII.GetBytes(password)));   
于 2013-01-10T23:26:05.953 に答える