我正在寻找一个与此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());
}
key = "secret“和test = "test”的输出似乎不匹配。
发布于 2009-10-23 06:28:16
事实上,他们确实是同意的。
正如Hans Doggen已经提到的,PHP使用十六进制表示法输出消息摘要,除非您将原始输出参数设置为true。
如果您想在Java中使用相同的表示法,您可以使用类似于
for (byte b : digest) {
System.out.format("%02x", b);
}
System.out.println();
以相应地格式化输出。
发布于 2011-05-25 20:04:27
您可以在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();
}
发布于 2011-05-12 02:40:22
这是我的实现:
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;
https://stackoverflow.com/questions/1609899
复制相似问题