50 votes

équivalent java à hmac-SHA1 de php

Je cherche un équivalent java à cet appel php:

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

J'ai essayé cela en utilisant java.crypto.Mac , mais les deux ne sont pas d'accord:

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

Les sorties avec clé = "secret" et test = "test" ne semblent pas correspondre.

39voto

Dirk D Points 491

En fait, ils sont d'accord.
Comme Hans Doggen l'a déjà noté, PHP génère le résumé du message en utilisant la notation hexadécimale, sauf si vous définissez le paramètre de sortie brut sur true.
Si vous voulez utiliser la même notation en Java, vous pouvez utiliser quelque chose comme:

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

formater la sortie en conséquence.

17voto

dharan Points 238

Vous pouvez essayer ceci en 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();
}
 

5voto

atomsfat Points 793

Ceci est ma mise en œuvre:

         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;
 

3voto

Hans Doggen Points 878

Il me semble que PHP utilise la notation HEX pour les octets générés par Java (1a = 26) - mais je n'ai pas vérifié l'expression entière.

Que se passe-t-il si vous exécutez le tableau d'octets via la méthode de cette page?

1voto

serg Points 43893

Je n'ai pas testé, mais essayez ceci:

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

Ceci est un instantané de ma méthode qui rend md5 de java et sha1 identique à php.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X