5

JS は初めてですが、暗号ライブラリの使用方法も学んでいます。同じシークレットを使用して同じメッセージに署名/エンコードすると、異なる結果が生じる理由がわかりません。

ここにあるjsSHA 1.3.1 と、ここにあるCryptoJS 3.0.2を使用して、base64 sha-1 でエンコードされた hmac 署名を作成しようとしています。コードは次のとおりです。

htmlで...

<script src="lib/jsSHA/src/sha1.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/hmac-sha1.js"></script>

そしてjsで...

var message = "shah me";
var secret = "hide me";
var crypto = CryptoJS.HmacSHA1(message, secret).toString(CryptoJS.enc.Base64) + '=';

var shaObj = new jsSHA(message, "ASCII");
var jssha = shaObj.getHMAC(secret, "ASCII", "B64") + '=';

return  "crypto answer is " + crypto + " jssha answer is " + jssha;

これらの結果が異なる理由を説明できますか?

crypto の回答は 3e929e69920fb7d423f816bfcd6654484f1f6d56= です jssha の回答は PpKeaZIPt9Qj+Ba/zWZUSE8fbVY= です

さらに、これらは両方とも、私がレールで生成している署名とは異なります。次のように...

digest  = OpenSSL::Digest::Digest.new('sha1')
raw_signature = OpenSSL::HMAC.digest(digest, "hide me","shah me")
b64_signature = Base64.encode64(raw_signature).strip

(フィドルを提供したかったのですが、これは非常に一般的な慣行のようですが、それも私にとっては初めてで、この質問に対して機能するフィドルを取得できませんでした)。

前もって感謝します。

4

1 に答える 1

7

あなたのコードには3つのエラーがあります:)

enc-base64-min.jsforがありませんcrypto-js。を呼び出すときにパラメーターCryptoJS.enc.Base64がありundefined
ません.getHMAC()。It's .getHMAC(secret, secret_type, hash_type, output_encoding)
With 1+2 追加する=必要はありません (正しくもありません)

<script src="lib/jsSHA/src/sha1.js"></script>  
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/hmac-sha1.js"></script>  
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64-min.js"></script>  

var message = "shah me";
var secret = "hide me";
var crypto = CryptoJS.HmacSHA1(message, secret).toString(CryptoJS.enc.Base64);
var shaObj = new jsSHA(message, "ASCII");
var jssha = shaObj.getHMAC(secret, "ASCII", "SHA-1", "B64");

return  "crypto answer is " + crypto + " jssha answer is " + jssha;

于 2012-12-02T17:59:42.793 に答える