Hướng dẫn dùng hmacsha1 trong PHP

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ề:

  1. Khóa ở định dạng được mã hóa URL đã sửa đổi, vì vậy việc thay đổi -_thành +/cũng không hoạt động
  2. Mã ví dụ Python thực sự hoạt động, vì vậy đây là một ví dụ hợp lệ.
  3. 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 74ae5a4a3d9996d5918defc2c3d475471bbf59accũ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áphash[ $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

Chủ Đề