使用 Zend 框架理解 PHP 中编写的一段代码

Understanding piece of code written in PHP using Zend framework

我是 java 开发人员,我正在尝试使用一个 WEB 服务 API (ticketutils),他们在其中解释了两个示例,第一个是 PHP,第二个一个 C#。不幸的是,我无法得到它们中的任何一个。我在下面提到了 PHP 示例。

 public function GenerateSignature($Secret,$PathAndQuery)
     {
       return base64_encode(\Zend_Crypt_Hmac::compute($Secret, 'sha256',
       $PathAndQuery, \Zend_Crypt_Hmac::BINARY));
     }

任何人都可以向我解释如何使用 Java 代码实现相同的目的吗?我试过下面的代码,但它似乎没有产生正确的结果。

public static String generateSignature(String secrete, String pathAndQuery){
        String encoded = null;
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            md.update(secrete.getBytes("UTF-8"));
            md.update(pathAndQuery.getBytes("UTF-8"));
            byte[] digest = md.digest();
            encoded = Base64.getEncoder().encodeToString(digest);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return encoded;
    }

注意: 我在编写上面的代码时使用了 Java-8。

消息摘要的 Java API 与 C# 非常相似。请遵循以下示例: https://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html

使用 sha256 对 Secret 关键字进行哈希处理。然后使用该关键字对 Base64 中的任何内容进行编码。

看看 http://www.jokecamp.com/blog/examples-of-creating-base64-hashes-using-hmac-sha256-in-different-languages/#java

不完全是你要找的东西,但你可以把这个过程变成一个函数,它有两个参数和 returns Base64 值..

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

public class ApiSecurityExample {
  public static void main(String[] args) {
    try {
     String secret = "secret";
     String message = "Message";

     Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
     SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
     sha256_HMAC.init(secret_key);

     String hash = Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));
     System.out.println(hash);
    }
    catch (Exception e){
     System.out.println("Error");
    }
   }
}