10
votes

Java SHA256 sortira de différents hachages à PHP SHA256?

Code PHP:

écho hachage ('SHA256', 'Jake');

Sortie PHP:

CDF30C6B345B8E0C1DD858F92731D

code Java: xxx

sortie Java:

-51-1312107528211839-117-39-43884791- 1141229-4088-12110-12-223531-11011529

Je m'attendais aux deux de renvoyer le même résultat. Évidemment, ce n'est pas le cas. Comment puis-je obtenir les deux pour correspondre ou est-ce impossible?

Edit: J'avais commis une erreur, pensez avoir la réponse à la question de toute façon.


1 commentaires

Vérifiez votre codage de caractères - PHP fonctionne avec des octets, Java utilise-t-elle UTF8 ou UTF16 (ou quoi)?


3 Réponses :


13
votes

Eh bien, la chose tout d'abord que vous devez faire est d'utiliser un codage de chaîne cohérent. Je ne sais pas ce que PHP fera, mais "jake" .betbytes () utilisera tout ce que votre codage par défaut de la plate-forme est pour Java. C'est un vraiment mauvaise idée . L'utilisation de UTF-8 serait probablement un bon départ, en supposant que les copies PHP avec des chaînes Unicode pour commencer. (Si ce n'est pas le cas, vous devez déterminer ce qu'il est faire et essayer de faire les deux cohérents.) En Java, utilisez la surcharge de string.getbytes () < / code> qui prend un charset ou celui qui prend le nom d'un Charset . (Personnellement, j'aime utiliser Guava's CHARSETS.UTF_8 .)

puis persuader PHP d'utiliser UTF-8 aussi.

Sortiez le résultat Java dans Hex. Je doute vivement que le code que vous avez donné est le code réel que vous utilisez, comme vous l'attendez autrement, je m'attends à des produits tels que "[B @ E48E1B". Tout ce que vous faites pour convertir le tableau d'octets en une chaîne, changez-le pour utiliser HEX.


2 commentaires

Python a tendance à utiliser ISO-8859-1, mais tente d'adopter UNICODE, cela peut donc dépendre de la version. Pour 'Jake' , une chaîne All-ASCII, cela devrait céder la même chose que UTF-8. Néanmoins, j'ai chaleureusement deuxièmement l'exigence de codage de chaîne constante.


@THOMAS: YUP - Je pensais qu'il était important d'obtenir ce droit Premier , avant le reste ... Parce que, dès que l'OP ait vu un "fonctionnement" de Digest (par exemple, en convertissant son existant Array d'octet à hex) Ils pourraient bien décider de déclarer la victoire :)



2
votes

Vous devez convertir le digest à une chaîne hexagonale avant de l'imprimer. Exemple de code peut être trouvé ici .


0 commentaires

6
votes

Ils imprimentent la même chose .. Convertissez votre octet [] en une chaîne hexagonale, vous verrez alors CDF30C6B345276278BEDC7BCE0C1DD858F46E0C1DD858F46EF4A231F92731D comme sortie Java, aussi:

public void testSomething() throws Exception {
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    md.update("jake".getBytes());
    System.out.println(getHex(md.digest()));
}

static final String HEXES = "0123456789ABCDEF";
public static String getHex( byte [] raw ) {
    if ( raw == null ) {
      return null;
    }
    final StringBuilder hex = new StringBuilder( 2 * raw.length );
    for ( final byte b : raw ) {
      hex.append(HEXES.charAt((b & 0xF0) >> 4))
         .append(HEXES.charAt((b & 0x0F)));
    }
    return hex.toString();
}


0 commentaires