java相当于php的hmac-SHA1

Bee*_*Bee 49 php java cryptography hmac

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

hash_hmac('sha1', "test", "secret")
Run Code Online (Sandbox Code Playgroud)

我试过这个,使用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());
}
Run Code Online (Sandbox Code Playgroud)

key ="secret"和test ="test"的输出似乎不匹配.

Dir*_*k D 39

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

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

相应地格式化输出.


dha*_*ran 16

您可以在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();
}
Run Code Online (Sandbox Code Playgroud)


ato*_*fat 5

这是我的实施:

        String hmac = "";

    Mac mac = Mac.getInstance("HmacSHA1");
    SecretKeySpec secret = new SecretKeySpec(llave.getBytes(), "HmacSHA1");
    mac.init(secret);
    byte[] digest = mac.doFinal(cadena.getBytes());
    BigInteger hash = new BigInteger(1, digest);
    hmac = hash.toString(16);

    if (hmac.length() % 2 != 0) {
        hmac = "0" + hmac;
    }

    return hmac;
Run Code Online (Sandbox Code Playgroud)