製造注意到了一個完整的Java程序
package javaapplication1;
import java.net.URLEncoder;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class JavaApplication1 {
public static void main(String[] args) {
try {
System.out.println(signData("GET\n1344250030\n/contacts.json"));
} catch (Exception ex) {
Logger.getLogger(JavaApplication1.class.getName()).log(Level.SEVERE, null, ex);
}
}
private static String signData(String data) throws Exception {
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec(Base64.decodeBase64("LPq6ZD2JdyPnBvxf6p6h"), "HmacSHA1"));
String sig = new String(Base64.encodeBase64(mac.doFinal(data.getBytes())));
return URLEncoder.encode(sig, "UTF-8");
}
}
的URLEncoder的,所以我補充說,到PHP。還懷疑你的網址應該使用雙引號,否則\ n不起作用。這給了這個代碼:
<?php
$signData = hash_hmac("sha1", "GET\n1344250030\n/contacts.json",
base64_decode('LPq6ZD2JdyPnBvxf6p6h'), true);
$signData = base64_encode($signData);
echo urlencode($signData);
都給出相同的結果,但不是你的預期。
fH%2F0XJpooui3U2nyd%2FCD9YjRVGM%3D
那麼你確定你的輸入是正確的嗎? URL和祕密?
hash_hmac在默認情況下返回一個十六進制字符串,看到您對可能期望爲二進制的結果使用base64編碼。您可以通過將true作爲hash_hmac的第四個參數來獲得此信息。但它不會給你期望的結果。你爲什麼期望這個價值,你能告訴我們更多關於它的信息嗎? – Eelke 2012-08-06 11:11:46
@Eelke hash_hmac每次返回相同的值還是不同的值?我期望的確定的價值,因爲只有該值是獲得適當的URL連接..這是從java hmac_sha1生成的值.. – user1578749 2012-08-06 11:34:50
每次相同的價值(對於相同的課程輸入)。你能展示那個java代碼嗎? – Eelke 2012-08-06 11:38:11