java 相当于 php 的 hmac-SHA1

2022-08-30 10:32:59

我正在寻找一个相当于这个php调用的java:

hash_hmac('sha1', "test", "secret")

我使用java.crypto.Mac尝试了这个,但两者并不一致:

String mykey = "secret";
String test = "test";
try {
    Mac mac = Mac.getInstance("HmacSHA1");
    SecretKeySpec secret = new SecretKeySpec(mykey.getBytes(),"HmacSHA1");
    mac.init(secret);
    byte[] digest = mac.doFinal(test.getBytes());
    String enc = new String(digest);
    System.out.println(enc);  
} catch (Exception e) {
    System.out.println(e.getMessage());
}

键 = “secret” 和 test = “test” 的输出似乎不匹配。


答案 1

事实上,他们确实同意。
正如Hans Doggen已经指出的那样,PHP使用十六进制表示法输出消息摘要,除非您将原始输出参数设置为true。
如果你想在Java中使用相同的符号,你可以使用类似的东西

for (byte b : digest) {
    System.out.format("%02x", b);
}
System.out.println();

以相应地格式化输出。


答案 2

你可以在Java中尝试这个:

private static String computeSignature(String baseString, String keyString) throws GeneralSecurityException, UnsupportedEncodingException {

    SecretKey secretKey = null;

    byte[] keyBytes = keyString.getBytes();
    secretKey = new SecretKeySpec(keyBytes, "HmacSHA1");

    Mac mac = Mac.getInstance("HmacSHA1");

    mac.init(secretKey);

    byte[] text = baseString.getBytes();

    return new String(Base64.encodeBase64(mac.doFinal(text))).trim();
}

推荐