Tôi đang cố gắng thiết lập một số hành động API Google Maps Premier và để làm như vậy, tôi cần ký vào các URL của mình để xác thực. Nếu bạn đi xuống các ví dụ về Chữ ký, có một số mã Python, C # và Java để hướng dẫn bạn cách thực hiện chữ ký qua HMAC-SHA1. Ngoài ra còn có một ví dụ để tôi có thể kiểm tra việc triển khai PHP của mình. Tuy nhiên, tôi dường như không thể làm cho nó hoạt động.
Đây là mã của tôi:
$key = "vNIXE0xscrmjlyV-12Nj_BvUPaw=";
$data = "/maps/api/geocode/json?address=New+York&sensor=false&client=clientID";
$my_sign = hash_hmac["sha1", $data, base64_decode[$key]];
$my_sign = base64_encode[$my_sign];
$valid_sign = "KrU1TzVQM7Ur0i8i7K3huiw3MsA=";
Khi, tôi chạy cái này, tôi nhận được chữ ký của:
ZDRlNGMwZjIyMTA1MWM1Zjk0Nzc4M2NkYjlmNDQzNDBkYzk4NDI4Zg==
Mà hoàn toàn không phù hợp.
Những điều tôi đã nghĩ về:
- Khóa ở định dạng được mã hóa URL đã sửa đổi, vì vậy việc thay đổi
-
và_
thành+
và/
cũng không hoạt động - Mã ví dụ Python thực sự hoạt động, vì vậy đây là một ví dụ hợp lệ.
- Viết lại hoàn toàn cơ sở mã của chúng tôi bằng python thay vì PHP [tôi đã kế thừa nó].
9 hữu ích 0 bình luận 13k xem chia sẻ
Tôi đang băm một số giá trị bằng HMAC-SHA1, sử dụng mã sau trong Java:
public static String hmacSha1[String value, String key] {
try {
// Get an hmac_sha1 key from the raw key bytes
byte[] keyBytes = key.getBytes[];
SecretKeySpec signingKey = new SecretKeySpec[keyBytes, "HmacSHA1"];
// Get an hmac_sha1 Mac instance and initialize with the signing key
Mac mac = Mac.getInstance["HmacSHA1"];
mac.init[signingKey];
// Compute the hmac on input data bytes
byte[] rawHmac = mac.doFinal[value.getBytes[]];
// Convert raw bytes to Hex
byte[] hexBytes = new Hex[].encode[rawHmac];
// Covert array of Hex bytes to a String
return new String[hexBytes, "UTF-8"];
} catch [Exception e] {
throw new RuntimeException[e];
}
}
Hex[]
thuộc về org.apache.commons.codec
Trong PHP, có một hàm tương tự hash_hmac[algorithm, data, key]
mà tôi sử dụng để so sánh các giá trị được trả về bởi việc triển khai Java của tôi.
Vì vậy, thử đầu tiên là:
hash_hmac["sha1", "helloworld", "mykey"] // PHP
trả về: 74ae5a4a3d9996d5918defc2c3d475471bbf59ac
Hàm Java của tôi 74ae5a4a3d9996d5918defc2c3d475471bbf59ac
cũng trả về .
Ok, nó có vẻ hoạt động. Sau đó, tôi cố gắng sử dụng một khóa phức tạp hơn:
hash_hmac["sha1", "helloworld", "PRIE7$oG2uS-Yf17kEnUEpi5hvW/#AFo"] // PHP
trả về: e98bcc5c5be6f11dc582ae55f520d1ec4ae29f7a
Trong khi lần
này, Java của tôi impl trả về: c19fccf57c613f1868dd22d586f9571cf6412cd0
Hàm băm được trả về bởi mã PHP của tôi không bằng giá trị được trả về bởi hàm Java của tôi và tôi không thể tìm hiểu lý do.
Có lời khuyên nào không?
57 hữu ích 3 bình luận 65k xem chia sẻ
Hàm hash[]
sẽ mã hóa chuỗi truyền vào theo một thuật toán nhất định. Thuật toán mã hóa sẽ do người dùng cung cấp.
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.
Cú pháp
Cú pháp: hash[ $algo, $str ,$raw_output];
Trong đó:
$algo
là thuật toán mã hóa.$str
là chuỗi cần mã hóa.$raw_output
là tham số, mặc định mang giá trị FALSE chuỗi trả về sẽ là chuỗi in thường thập phân. Nếu$raw_output
mang giá trị TRUE chuỗi trả về sẽ là chuỗi theo kiểu nhị phân.
Kết quả trả về
Hàm sẽ trả về chuỗi được tính toán dưới dạng nhị phân nếu $raw_output
mang giá trị TRUE, và trả về chuỗi được tính
toán dưới dạng thập phân nếu $raw_output
mang giá trị FALSE .
Bài viết này được đăng tại [free tuts .net]
Ví dụ
Mã hóa theo kiểu "ripemd160":
Code
echo hash['ripemd160', 'The quick brown fox jumped over the lazy dog.'] . "
"; echo hash['ripemd160', 'The quick brown fox jumped over the lazy dog.', true];
Kết quả
5c6ffbdd40d9556b73a21e63c3e0e904 ec457d0a974c48d5685a7efa03d137dc8bbde7e3
Mã hóa theo kiểu "md5":
Code
echo hash['md5', 'The quick brown fox jumped over the lazy dog.'] . "
"; echo md5["The quick brown fox jumped over the lazy dog."] . "
";
Kết quả
5c6ffbdd40d9556b73a21e63c3e0e904 5c6ffbdd40d9556b73a21e63c3e0e904
Tham khảo: php.net