Php hashhmac-sha1-有符号值出错?
api_secret的值为Php hashhmac-sha1-有符号值出错?,php,sha1,hmac,hmacsha1,Php,Sha1,Hmac,Hmacsha1,api_secret的值为 $signData = hash_hmac("sha1", 'GET\n1344250030\n/contacts.json', base64_decode($this->api_secret)); $signData = base64_encode($signData); result$signData的值为 ZTYxM2NkYmNhZDJiZDUxZWUwMWIyNGRlZTlmYTc3MDliM2FiY2NhYQ== 但$
$signData = hash_hmac("sha1", 'GET\n1344250030\n/contacts.json',
base64_decode($this->api_secret));
$signData = base64_encode($signData);
result$signData的值为
ZTYxM2NkYmNhZDJiZDUxZWUwMWIyNGRlZTlmYTc3MDliM2FiY2NhYQ==
但$signData的预期结果是
QbOd8%2BOIzHMKrmEpf4G%2FZFWLAx8%3D
我应该将此预期结果用于url连接
我哪里做错了?帮帮我。制作了一个完整的java程序
LPq6ZD2JdyPnBvxf6p6h
注意到URLEncoder,所以我将其添加到PHP中。还应怀疑您的URL应该使用双引号,否则\n将不起作用。它给出了这个代码:
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");
}
}
那么你确定你的输入是正确的吗?URL和secret?hashhmac在默认情况下都返回一个十六进制字符串,如果对结果使用base64编码,则可能需要二进制。您可以通过将true作为第四个参数传递给hash_hmac来实现这一点。然而,它不会给出你期望的结果。为什么你期望那个值,你能告诉我们更多吗?@Eelke hash_hmac每次都返回相同的值还是不同的值?我希望使用特定的值,因为只有该值才能获得正确的url连接。。这就是java hmac_sha1生成的值。当然,每次输入相同的值。你能展示一下java代码吗?明白了。。我还没有对url进行编码。。那就是我错过的地方。。谢谢
<?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