MessageDigest ???? - Java - Programmation
Marsh Posté le 21-02-2003 à 13:57:34
Ui. C'est assez facile une fois que t'as bien tout compris comment marche le bordel. J'ai fait une classe de générateur d'UID unique se basant sur MD5 y a genre un an.
Concernant MD5 et MessageDigest, ça marche comme ça :
* récupére la bonne instance de codage. Ici, MD5. Donc : MessageDigest md = MessageDigest.getInstance("MD5" );
* ensuite, t'updates ton MessageDigest avec le tableau de bytes que tu veux encoder : md.update(byteArray);
* tu récupères les bytes encodés avec digest : byte[] encodedBytes = md.digest();
Et voilou.
Marsh Posté le 21-02-2003 à 14:00:56
donc, admettons que j'ai une variable String, il faut que je la cast en byteArray puis que je fasse ce que tu dis??
ensuite, faut que je fasse un toString sur le byte[] de résultat pour récupérer la chaine correspondante, c ça?
Marsh Posté le 21-02-2003 à 14:15:06
arghbis a écrit : donc, admettons que j'ai une variable String, il faut que je la cast en byteArray puis que je fasse ce que tu dis?? |
Non, pas tout à fait. Déjà, tu peux pas faire de cast en tableau de bytes sur une String, ça a pas de sens. Mais tu as la joulie méthode getBytes() de la classe String qui va t'aider à récupérer ta chaîne sous forme de byte[]
Ensuite, une fois que t'as fait le digest(), tu récupères des bytes dont la valeur est comprise entre -128 et +127 (ou -127 et +128, j'sais jamais ), bref c'est la chiotte pour rebalancer le tout dans une String.
Donc pour que ça marche, faut faire un ET logique avec 11111111 sur chaque byte du tableau :
int b = encBytes[i] & 255;
Tu peux ensuite caster le int en char : char c = (char) b; (ça peut se faire directement dans la ligne du dessus mais j'ai décomposé pour que ça soit plus compréhensible)
Et t'ajoutes ton char dans un StringBuffer, pour finir par retourner tonStringBuffer.toString().
Marsh Posté le 21-02-2003 à 14:18:52
m'enfin quand même, c bien compliqué le java je trouve! pour faire un truc tout simple, t'as besoin de dix types différents, et pour les convertir c galère!!
tant qu'à faire que de faire une classe MessageDigest, ils auraient pu en faire une qui prend et ressort un String nom??
Marsh Posté le 21-02-2003 à 14:23:31
Bin non ! Une classe MessageDigest a pour but d'encoder des données de taille variable en des données de taille fixe :
Citation : This MessageDigest class provides applications the functionality of a message digest algorithm, such as MD5 or SHA. Message digests are secure one-way hash functions that take arbitrary-sized data and output a fixed-length hash value. |
Il est donc normal que ça soit des bytes et non des String. Tu peux facilement extraire des bytes d'une String et inversement ; c'est juste que dans le cas présent, tu dois appliquer un ET logique pour avoir des unsigned bytes et obtenir des caractères lisibles. Ce souci vient du fait que tu as besoin de spécialiser les fonctionnalités de MessageDigest pour tes propres besoins.
Marsh Posté le 21-02-2003 à 14:28:08
je ne dis pas le contraire, mais en tant que programmeur débutant en java et fainéant, je trouve ça bizarre. Tu devrais pourvoir envoyer un String et ressortir un String, sans te préoccuper de le transformer en byteArray. Ce devrait être le constructeur qui devrait s'en charger, de manière transparente!
il me semblait que justement, avoir des contructeurs acceptant des variables différentes en nombre et en type était un des avantages de java!
Marsh Posté le 21-02-2003 à 14:32:47
arghbis a écrit : je ne dis pas le contraire, mais en tant que programmeur débutant en java et fainéant, je trouve ça bizarre. Tu devrais pourvoir envoyer un String et ressortir un String, sans te préoccuper de le transformer en byteArray. Ce devrait être le constructeur qui devrait s'en charger, de manière transparente! |
Oui mais mets-toi aussi à la place du développeur de la classe MessageDigest. Il ne sait pas quel type de données peut lui être envoyé. Y a des gens qui vont vouloir encoder des chaînes mais d'autres qui vont vouloir encoder des fichiers ou que sais-je. Il ne va pas se taper toutes les surcharges de constructeurs possibles et imaginables uniquement pour le confort du développeur en face. Surtout que les manips que je t'ai données sont loin d'être fastidieuses : 3 méthodes de la classe à appeler (dont un constructeur), une boucle for, un ET logique et c'est fini. En 10 lignes c'est torché, donc bon faut quand même pas se plaindre
Marsh Posté le 21-02-2003 à 14:37:17
Non, je ne me plaint pas vraiment, je constate, c tout!
je prend pour référence le langage que je connais le mieux : Perl (et on ne se moque pas hein! )
Ben pour faire un MD5, t'as une méthode si c un fichier, une méthode ci c une chaine de caractères, une méthode si c un tableau et pis c tout! et en sortie, tu as les trois méthodes équivalentes. Donc, j'estime que c plus simple et plus complet, maintenant je me trompe peut-être et je changerais peut-être d'avis qd je connaitrais mieux java (pour l'instant comme tu peux t'en rendre compte c un peu difficile pour moi)!
merci pour tout!
Marsh Posté le 21-02-2003 à 14:55:19
le principe de Java c'est que c'est du Composant. Tu as des Objets, et tu les assembles pour arriver à résoudre ton problème.
C'est peut être un peu plus chiant à mettre en place mais c'est beaucoup plus ouvert !
Marsh Posté le 21-02-2003 à 15:15:57
tant que j'y suis à poser des questions à la con, vous n'auriez pas un site ou une doc où ils filent un exemple pour les classes?? paske ça serait bien pratique qd même!!
Marsh Posté le 21-02-2003 à 15:17:18
arghbis a écrit : tant que j'y suis à poser des questions à la con, vous n'auriez pas un site ou une doc où ils filent un exemple pour les classes?? paske ça serait bien pratique qd même!! |
Doc générale : http://java.sun.com/j2se/1.4/docs/api/index.html
Sinon, pour MessageDigest j'ai pas. Mais un coup de devrait le faire.
Marsh Posté le 21-02-2003 à 15:20:16
ouaip, je l'ai déjà celle là, je te remercie. pour MessageDigest c bon, chuis pas un boulay fini qd même!!
non, c t pour la suite, pour éviter d'embêter le monde qd j'ai une question simple!!
Marsh Posté le 21-02-2003 à 13:50:15
Salut tout le monde, c'est moi que revoilou, avec une question certainement très simple de Java!
je n'arrive pas à utiliser la classe MessageDigest du package security de Java (je veux avoir un MD5sum en sortie)! quelqu'un aurait un exemple??
merci