php hmac-SHA1 java eşdeğer

6 Cevap java

Ben bu php çağrı eşdeğer bir java arıyorum:

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

I java.crypto.Mac kullanarak, bu çalıştı, ancak iki kabul etmiyorum:

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 = "gizli" ve testi ile çıkışları = "test" maç görünmüyor.

6 Cevap

In fact they do agree.
As Hans Doggen already noted PHP outputs the message digest using hexadecimal notation unless you set the raw output parameter to true.
If you want to use the same notation in Java you can use something like

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

buna göre çıkış biçimlendirmek için.

Java ile bu deneyebilirsiniz:

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();
}

Ama ben bütün ifade kontrol etmedi - PHP Java (1a = 26) üretir bayt için HEX gösterimi kullanır gibi geliyor bana.

Eğer this sayfasındaki yöntemi ile bayt dizisi çalıştırırsanız ne olur?

Bunu test, ama bu deneyin değil:

		BigInteger hash = new BigInteger(1, digest);
		String enc = hash.toString(16);
		if ((enc.length() % 2) != 0) {
			enc = "0" + enc;
		}

Bu Java MD5 ve SHA1 maç php yapar benim yöntemi anlık olduğunu.

Bu benim uygulamasıdır:

        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;

HmacMD5 için benim uygulama - sadece HMACSHA1 için algoritmasını değiştirmek:

SecretKeySpec keySpec = new SecretKeySpec("secretkey".getBytes(), "HmacMD5");
Mac mac = Mac.getInstance("HmacMD5");
mac.init(keySpec);
byte[] hashBytes = mac.doFinal("text2crypt".getBytes());
return Hex.encodeHexString(hashBytes);