3

私は暗号化アルゴリズムの専門家ではないと言って始めましょう...

Windows Azure の HTTP ヘッダーをフォーマットするメソッドを構築しようとしています。このヘッダーでは、メッセージの一部を SHA256 を使用して HMAC 経由で暗号化する必要があります (さらに base64 エンコード)。

アクティブなユーザー コミュニティがあることから、CryptoJSを使用することにしました。

まず、私のコード:

_encodeAuthHeader : function (url, params, date) {
    //http://msdn.microsoft.com/en-us/library/windowsazure/dd179428
    var canonicalizedResource = '/' + this.getAccountName() + url;

    /*
     StringToSign = Date + "\n" + CanonicalizedResource
     */
    var stringToSign = date + '\n' + canonicalizedResource;
    console.log('stringToSign >> ' + stringToSign)

    var encodedBits = CryptoJS.HmacSHA256(stringToSign, this.getAccessKey());
    console.log('encodedBits >> ' + encodedBits);

    var base64Bits = CryptoJS.enc.Base64.stringify(encodedBits);
    console.log('base64Bits >> ' + base64Bits);

    var signature = 'SharedKeyLite ' + this.getAccountName() + ':' + base64Bits;
    console.log('signature >> ' + signature);

    return signature;
},

このメソッドは、暗号化/エンコードされた適切な部分を含む「署名」を正常に返します。ただし、Azure は、正しくフォーマットされていないと文句を言います。

出力例:

stringToSign >> Mon, 29 Jul 2013 16:04:20 GMT\n/senchaazurestorage/Tables

encodedBits >> 6723ace2ec7b0348e1270ccbaab802bfa5c1bbdddd108aece88c739051a8a767

base64Bits >> ZyOs4ux7A0jhJwzLqrgCv6XBu93dEIrs6IxzkFGop2c=

signature >> SharedKeyLite senchaazurestorage:ZyOs4ux7A0jhJwzLqrgCv6XBu93dEIrs6IxzkFGop2c=

デバッグを行っていると、CryptoJS が代替実装と同じ値 (SHA256 を使用した HMAC) を返していないことに気付きました。たとえば、文字列 " Mon, 29 Jul 2013 16:04:20 GMT\n/senchaazurestorage/Tables " は次のように表示されます。

  • 6723ace2ec7b0348e1270ccbaab802bfa5c1bbdddd108aece88c739051a8a767」CryptoJS経由
  • " faa89f45ef029c63d04b8522d07c54024ae711924822c402b2d387d05398fc9f " PHP hash_hmac('sha256', ... ) 経由

さらに深く掘り下げると、ほとんどの HMAC/SHA265 アルゴリズムが PHP からの出力と一致するデータを返すことがわかります。CryptoJS で何か不足していますか? それとも正当な違いがありますか?

4

1 に答える 1