J'implémente une interface pour le service de paiement numérique appelée Suomen Verkkomaksut. Les informations sur le paiement leur sont envoyées via un formulaire HTML. Pour s'assurer que personne ne manipule les informations pendant le transfert, un hachage MD5 est calculé aux deux extrémités avec une clé spéciale qui ne leur est pas envoyée. Mon problème est que pour une raison quelconque, ils semblent décider que les données entrantes sont encodées avec ISO-8859-1 et non UTF-8. Le hachage que je leur ai envoyé est calculé avec des chaînes UTF-8 donc il diffère du hash qu'ils calculent.MD5 Hash de la chaîne ISO-8859-1 en Java
J'ai essayé avec le code suivant:
String prehash = "6pKF4jkv97zmqBJ3ZL8gUw5DfT2NMQ|13466|123456||Testitilaus|EUR|http://www.esimerkki.fi/success|http://www.esimerkki.fi/cancel|http://www.esimerkki.fi/notify|5.1|fi_FI|0412345678|0412345678|[email protected]|Matti|Meikäläinen||Testikatu 1|40500|Jyväskylä|FI|1|2|Tuote #101|101|1|10.00|22.00|0|1|Tuote #202|202|2|8.50|22.00|0|1";
String prehashIso = new String(prehash.getBytes("ISO-8859-1"), "ISO-8859-1");
String hash = Crypt.md5sum(prehash).toUpperCase();
String hashIso = Crypt.md5sum(prehashIso).toUpperCase();
Malheureusement les deux hash sont identiques à la valeur C83CF67455AF10913D54252737F30E21. La valeur correcte pour cet exemple est 975816A41B9EB79B18B3B4526569640E selon la documentation de Suomen Verkkomaksut.
Existe-t-il un moyen de calculer le hachage MD5 en Java avec les chaînes ISO-8859-1?
MISE À JOUR: En attendant la réponse de Suomen Verkkomaksut, j'ai trouvé une autre façon de faire le hachage. Michael Borgwardt a corrigé ma compréhension de la chaîne et des encodages et j'ai cherché un moyen de faire du hash []. Apache Commons est une excellente source de bibliothèques et j'ai trouvé leur classe DigestUtils qui a une fonction md5hex qui prend l'entrée byte [] et renvoie une chaîne hexadécimale de 32 caractères.
Pour une raison quelconque, cela ne fonctionne toujours pas. Ces deux renvoient la même valeur:
DigestUtils.md5Hex(prehash.getBytes());
DigestUtils.md5Hex(prehash.getBytes("ISO-8859-1"));
N'utilisez jamais la première forme de 'getBytes()' si vous voulez obtenir un résultat prévisible. Il utilise l'encodage par défaut de votre système. Vous venez de Finlande, il est fort probable que votre encodage par défaut soit 'ISO-8859-1', donc les deux appels produiront les mêmes résultats. –