2016-01-22 119 views
3

我试图在Javascript中使用CryptoJS构建HMAC SHA256字符串,我现有的代码是使用Akamai库在PHP中编写的。为什么HMAC sha256在PHP和Javascript上返回不同的值

在某些情况下,我比PHP &得到不同的结果我无法理解为什么它给我不同的结果

/* 
     <php> Using native hash_hmac 
     Generating key by concatenating char 
    */ 

     $signature1 = hash_hmac('SHA256', "st=1453362060~exp=1453363260~acl=/*", chr(63)); 
     $signature2 = hash_hmac('SHA256', "st=1453362060~exp=1453363260~acl=/*", chr(63) . chr(23)); 
     $signature3 = hash_hmac('SHA256', "st=1453362060~exp=1453363260~acl=/*", chr(63) . chr(23) . chr(253)); 

    /* 
     here is result from php 
     signature1 : 3e086bb48ab9aafa85661f9ce1b7dac49befddf117ce2a42d93c92b6abe513ce (matched: same as JavaScript) 
     signature2 : 3667dd414a50f68f7ce083e540f27f68f7d0f18617b1fb1e4788bffeaeab59f6(matched: same as JavaScript) 
     signature3 : dd5a20041661046fdee871c8b9e77b3190fbbf85937c098090a1d524719b6aa9 (not matched: diff from JavaScript) 
    */ 


    /* 
     <JavaScript> using CryptoJS 
     Generating key by concatenating three char 
    */ 

    var signature1 = CryptoJS.HmacSHA256("st=1453362060~exp=1453363260~acl=/*", String.fromCharCode(63)); 
    var signature2 = CryptoJS.HmacSHA256("st=1453362060~exp=1453363260~acl=/*", String.fromCharCode(63) + String.fromCharCode(23)); 
    var signature3 = CryptoJS.HmacSHA256("st=1453362060~exp=1453363260~acl=/*", String.fromCharCode(63) + String.fromCharCode(23) + String.fromCharCode(253)); 

    /* 
     here is result from JavaScript 
     signature1 : 3e086bb48ab9aafa85661f9ce1b7dac49befddf117ce2a42d93c92b6abe513ce (matched: same as php) 
     signature2 : 3667dd414a50f68f7ce083e540f27f68f7d0f18617b1fb1e4788bffeaeab59f6 (matched: same as php) 
     signature3 : 28075dc75de9f22f83e87772f09a89efb007f2e298167686832eff122ef6eb08 (not matched: diff from php) 
    */ 

前两个HMAC值相匹配,但是当我追加第三焦炭它产生不同的结果,任何人都可以解释为什么这是。

这里是
PHPFiddle & JSFiddle

回答

2

CryptoJS添加UTF8编码中的 “钥匙”,同时创造哈希SHA256,使我们得到不同的值。

如果我在PHP侧包裹函数utf8_encode那么我们将得到的比较JavaScript的

 // <php> 
    $key = chr(63) . chr(23) . chr(253); 
    signature3 = hash_hmac('SHA256', "st=1453362060~exp=1453363260~acl=/*", utf8_encode($key)); 
+1

如何使CryptoJS获得PHP的结果,而不是(反向)相同的HMAC值? – Raptor

相关问题