IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Problème d'encodage (et peut-être de chiffrement)


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 19
    Points : 14
    Points
    14
    Par défaut Problème d'encodage (et peut-être de chiffrement)
    Bonjour à tous,

    J'essaie dans une appli J2EE de générer un mot de passe chiffré à partir d'un tableau de bytes, ce qui est demandé par la fonction digest() de MessageDigest. Or le tableau de bytes me sort invariablement le même genre de string : [B@34f65b5b

    J'ai bien essayé de forcer l'encodage, d'en changer plusieurs fois, mais rien n'y fait.
    Voici déjà une portion de mon code de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try {
                String encodage = "UTF-16";
                String s = "kkkk";
                System.out.println(s + " / " +s.getBytes(encodage));
                System.out.println(encodage);
            } catch (UnsupportedEncodingException ex) {
                Logger.getLogger(FormAddClient.class.getName()).log(Level.SEVERE, null, ex);
            }

    Quant au chiffrement, là aussi ça ne fonctionne pas, puisqu'il me retourne le même genre de chaîne. Voici la partie qui concerne le chiffrement (ne vous attardez pas sur la génération du password, je générerai une clé aléatoire plus tard. D'ailleurs si quelqu'un a un lien pour faire ça rapidement et facilement je suis preneur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    //génération du login/password
            client.setLogin(client.getNom()+client.getPrenom());
            Integer numberRandom = new Random().nextInt();
            String password = client.getLogin().concat(numberRandom.toString());
            try{
                //on récupère un tableau de bytes pour hasher le login et générer un password
                //avec le login
                byte[] hashedPassword = MessageDigest.getInstance("SHA-1").digest(password.getBytes());
                //client.setPassword(hashedPassword);
                System.out.println(password+ " / "+password.getBytes()+" / "+hashedPassword);
            } catch (MessagingException ex) {
                Logger.getLogger(FormAddClient.class.getName()).log(Level.SEVERE, null, ex);
            }catch(NoSuchAlgorithmException e){
                e.getMessage();
            }catch(Exception e2){
                e2.getMessage();
            }
    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par GiZeus Voir le message
    Or le tableau de bytes me sort invariablement le même genre de string : [B@34f65b5b
    La méthode toString() des tableaux n'est pas implémentés, et affiche le type suivi du hashcode par défaut...

    Si tu veux afficher le contenu du tableau il faut le faire manuellement ou utiliser la méthode Arrays.toString().


    a++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Merci pour ta réponse adiGuba. J'avais encore un problème avec la récupération du tableau de bytes, qui m'affichait ces hiéroglyphes féroces :
    T��v�x�WKh$p�V�Z?C�
    mais je l'ai résolu. La méthode toString ne marche pas sur le tableau de bytes qui récupère le hash, et du coup j'ai du faire comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
                String password = client.getLogin().concat(numberRandom.toString());
                String chiffrement = "MD5";
                MessageDigest md = MessageDigest.getInstance(chiffrement);
                byte[] stringToDigest = password.getBytes("UTF-8");
                byte[] hashedPassword = md.digest(stringToDigest);
     
                // code rajouté :
                String result = "";
                for (int i = 0; i < hashedPassword.length; i++) {
                  result += Integer.toHexString((0x000000ff & hashedPassword[i]) | 0xffffff00).substring(6);
                }
     
                System.out.println("mot de passe : "+password+ " / mot de passe haché : "+ new String(hashedPassword, "UTF-8"));

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Euh... T'es sûr que tu affiches new String(hashedPassword, "UTF-8") et pas plutôt result ?

    Parce que je serais assez surpris que ces octets puissent être représentés comme texte réél. C'est exactement le genre de trucs qui produiraient les fameux "hiéroglyphes".

    Sinon, quelques remarques :

    - #1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Integer.toHexString((0x000000ff & hashedPassword[i]) | 0xffffff00).substring(6);
    se simplifie en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String.format("%02x", hashedPassword[i] & 0xff)
    & 0xff assure que la valeur ne dépassera pas un octet, et donc pas plus de deux chiffres hexadécimaux.
    %02x demande à formater un nombre en hexadécimal sur au moins deux chiffres.
    => au mois deux chiffres et au plus deux chiffres => exactement 2 chiffres.

    - #2

    Il faut éviter de concaténer des String dans une boucle avec +=
    Cela passe son temps à créer et allouer des String ce qui est artificiellement mauvais pour les performances et la mémoire. Il vaut mieux utiliser un StringBuilder.

    Donc là on réécrirait la boucle en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // On alloue directement la bonne taille, tant qu'à faire. Deux chiffres par octet.
    StringBuilder builder = new StringBuilder(2*hashedPassword.length);
    for (int i = 0; i < hashedPassword.length; i++) {
      String hex = String.format("%02x", hashedPassword[i] & 0xff);
      builder.append(hex);
    }
    String result = builder.toString();
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Problème MYSQL php ou peut-être ajax. je ne sais pas.
    Par reventlov dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 16/06/2015, 18h29
  2. problème non identifié (boucle peut être ?)
    Par cldlk dans le forum Débuter
    Réponses: 7
    Dernier message: 22/10/2014, 06h55
  3. problème de connexion, MTU peut-être
    Par bilouchka dans le forum Réseau
    Réponses: 0
    Dernier message: 26/04/2011, 13h32
  4. problème bizarre de mémoire(peut-être)
    Par s3b18 dans le forum SL & STL
    Réponses: 3
    Dernier message: 30/04/2008, 20h04
  5. Problème de variables peut être pas intialisées
    Par gregory.bts dans le forum Langage
    Réponses: 14
    Dernier message: 12/10/2006, 09h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo