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

Sécurité Java Discussion :

Utilisation de MD5 en java


Sujet :

Sécurité Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 52
    Points : 30
    Points
    30
    Par défaut Utilisation de MD5 en java
    bonjour,
    dans mon programme je veux vérifier l'intégrité des fichiers écrit/modifié/téléchargé, et j'ai vu que je peux faire avec l'algotithme md5 mais j'ai pas trouvé de code java qui peut me servir d'exemple,
    j'ai trouvé juste pour crypté un mot de passe et moi se que je veux faire c'est vérifié l'intégrité de mes données (fichiers) aprés les avoir modifié

    donc merci de me dire si je suis sur la bon chemin (en utilisant le MD5 ) et si c'est possible me donner un petit peu de code pour me lancer

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Tu es sur que c'est faisable avec du MD5 ?

    Parce que MD5 est un algorythme de cryptage et il ne me semble pas qu'il remplit d'autres offices, comme tu peut le voir ici

  3. #3
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Oui, MD5 peut être utilisé pour signer un document donc en vérifier l'intégrité.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
             java.security.MessageDigest msgDigest = java.security.MessageDigest.getInstance("MD5");
             msgDigest.update("<a href="http://www.developpez.com".getBytes());" target="_blank">www.developpez.com".getBytes());</a>
             byte[] digest = msgDigest.digest();
             for (int i = 0; i < digest.length; ++i) {
                 int value = digest[i];
                 if (value < 0) {
                     value += 256;
                 }
                 System.out.print(Integer.toHexString(value) + " ");
             }
             System.out.println();

  4. #4
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Petit conseil : utilise la fonction de hachage "SHA-1" plutôt que MD5, pour calculer l' <<empreinte>> (et non-pas la <<signature>>) de tes fichiers ; il existe en effet une faille de sécurité par collision sur MD5 !

    De plus il est préférable d'utiliser l'encodage UTF-8 de ton texte en bits, en faisant un standard et portable plutôt qu'un avec le charset par défaut de la plateforme.

    Pour info.
    - les fonctions de hachage (MD5,SHA-1,SHA-256...) permettent uniquement de vérifier l'intégrité des données.
    - les algorithmes de signature (MD5withDSA,SHA-1withRSA...) permettent de garantir la non-répudiation des données (intégrité + origine) grâce à une clé secrète identifiant la provenance.

    En plus il n'y a jamais (à ma connaissance?) d'espace entre les notations hexa des bytes.


  5. #5
    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
    Citation Envoyé par g_rare
    En plus il n'y a jamais (à ma connaissance?) d'espace entre les notations hexa des bytes.
    +1

    De plus il faut faire attention à Integer.toHexString() qui renvoit "0" pour la valeur 0 au lieu de "00".

    Pour représenter le tableau renvoyé par digest() tu peux utiliser cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        private static final String HEX_DIGITS = "0123456789abcdef";
     
        private static String toHexString(byte[] v) {
     
            StringBuffer sb = new StringBuffer(v.length * 2);
            for (int i = 0; i < v.length; i++) {
                int b = v[i] & 0xFF;
                 sb.append(HEX_DIGITS.charAt(b >>> 4))
                   .append(HEX_DIGITS.charAt(b & 0xF));
            }
            return sb.toString();
        }
    a++

  6. #6
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Moi j'utilise le code suivant, mais j'avoue (humblement) que c'est peut-être équivalent : parce que les "manipulations d'octets" c'est pas ma spécialité ?!...
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    /**
         * Convertit des octets en leur representation hexadecimale (base 16),
         * chacun se retrouvant finalement 'non signe' et sur 2 caracteres.
         * 
         * @see http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html
         */
        public static String byteToHex(byte[] bits) {
            if (bits == null) {
                return null;
            }
            StringBuffer hex = new StringBuffer(bits.length * 2); // encod(1_bit) => 2 digits
            for (int i = 0; i < bits.length; i++) {
                if (((int) bits[i] & 0xff) < 0x10) { // 0 < .. < 9
                    hex.append("0");
                }
                hex.append(Integer.toString((int) bits[i] & 0xff, 16)); // [(bit+256)%256]^16
            }
            return hex.toString();
        }
     
        /**
         * Convertit une representation d'hexadecimaux (base 16) en octets,
         * chacun étant initialement 'non signe' et sur 2 caracteres.
         * 
         * @see http://forum.java.sun.com/thread.jspa?threadID=659432
         */
        public static byte[] hexToByte(String bits) {
            if ((bits == null) || (bits.length() % 2 != 0)) { // pair [xy]
                return null;
            }
            byte[] bytes = new byte[bits.length() / 2]; // decod(2_digits) => 1 bit
            for (int i = 0; i < bytes.length; i++) {
                bytes[i] = (byte) Integer.parseInt(bits.substring(2 * i, 2 * i + 2), 16); // |bit|^16
            }
            return bytes;
        }

  7. #7
    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
    Citation Envoyé par g_rare
    Moi j'utilise le code suivant, mais j'avoue (humblement) que c'est peut-être équivalent : parce que les "manipulations d'octets" c'est pas ma spécialité ?!...
    Oui cela doit être équivalent... moi non plus ce n'est pas vraiment ma spécialité

    a++

  8. #8
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    J'ai posté des un prigramme de hachage en SHA-1 et MD5 sur cette page :
    http://www.developpez.net/forums/sho...t=13730&page=2

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par jowo Voir le message
    Oui, MD5 peut être utilisé pour signer un document donc en vérifier l'intégrité.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
             java.security.MessageDigest msgDigest = java.security.MessageDigest.getInstance("MD5");
             msgDigest.update("www.developpez.com".getBytes());
             byte[] digest = msgDigest.digest();
             for (int i = 0; i < digest.length; ++i) {
                 int value = digest[i];
                 if (value < 0) {
                     value += 256;
                 }
                 System.out.print(Integer.toHexString(value) + " ");
             }
             System.out.println();
    il y a un petit souci dans ce code ! Cherchez l'erreur.
    j'ai fait le tests avec "admin" (à la place de "www.developpez.com") et supprimé mes espaces afin de comparer avec un résultat obtenu avec la fonction MD5 de MySQL.
    Avec en java, j'ai obtenu la chaîne :
    "21232f297a57a5a743894ae4a801fc3"
    et avec MySQL, j'ai obtenu la chaîne :
    "21232f297a57a5a743894a0e4a801fc3"
    Tout et nickel, sauf qu'il manque un "0" entre le "a" et le "e"
    Si quelqu'un a une solution FIABLE, je suis preneur.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par Michel Voisin Voir le message
    il y a un petit souci dans ce code ! Cherchez l'erreur.
    Adiguba a déjà répondu à ce sujet plus haut, relisez

Discussions similaires

  1. Flux http sans utiliser de servlet (pb java sous Lotus Notes)
    Par berjaoui dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 08/02/2007, 12h25
  2. comment utiliser la JXTable dans Java 6
    Par bassim dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 19/01/2007, 19h55
  3. [md5] Différence Java - MySQL
    Par GLDavid dans le forum Sécurité
    Réponses: 1
    Dernier message: 02/08/2006, 10h50
  4. [Couche réseau]Comment utiliser du CRC en Java?
    Par Yanos dans le forum Langage
    Réponses: 6
    Dernier message: 30/06/2006, 16h23
  5. Réponses: 7
    Dernier message: 21/06/2005, 17h04

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