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 :

Vérifier l'intégrité d'un certificat


Sujet :

Sécurité Java

  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut Vérifier l'intégrité d'un certificat
    Salut,

    J'ai un pb dans la vérification de l'intégrité d'un certificat.
    En fait un certificat est formé de deux parties: data et signature.

    La premiere étape dans cette procedure (c'est à dire la vérification de l'integrité) est d'appliquer la fonction de hachage sha1 sur la partie data. Donc:

    1. Comment je peux extraire la partie data?
    2. D'ou j'obtient la fonction de hashage sha1?
    3. Comment je peux appliquer la fonction de hashage sur la partie data?

    Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    j'ai pas beacoup touché à ça mais j'avais trouvé ça je ne sais plus où donc désolé pour les sources :p

    pour le hashage tu doit il me semble passer par un MessageDigest

    par exemple pour le sha1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    final MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
    pour l'appliquer sur tes donnée je pense que ca doti donnée quelque chose comme ça :


    en prenant en comtpe par exemple que tes data sont récuperer sous forme de byte[]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    					byteArrayOutputStream.write(messageDigest.digest(data);
    voial uen piste, je te garantie pas que c'est ce que tu cherche ... mais du moins c'est ce que j'ai compris :p

  3. #3
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Ça ne sert à rien de faire ça manuellement, il suffit d'utiliser les méthodes mise à disposition par l'API ici.

    Testé et approuvé, ça marche très bien !

    Il faut utiliser la clef publique du signataire du certificat (donc généralement l'autorité de certification) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonCertificat.verify(ClefPubliqueDuSignataire, MonProvider);
    Si la clef publique n'est pas la bonne, tu auras une SignatureException avec ce message d'erreur : "Signature does not match." lors de l'exécution.

    Si la clef publique est la bonne, tu n'auras pas d'exception levée lors de l'exécution.

  4. #4
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut
    Merci pou vous,

    J'ai vu l'API, Mais il ne me permet pas d'achever les étapes que j'avais dit dans mon pb c'est à dire:
    L' extraction de la partie data,
    puis appliqué la fonction de hachage sha1 sur ce que j'ai extré.

    Question: Est ce qu'il y a des commandes openssl ou autres qui permet d'extraire directement la partie data??????????


    Merci encore.

  5. #5
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Tout ceci est effectué en interne de la méthode verify().

    Une signature numérique d'un document = Condensat (ou Hash en anglais) de ce document puis chiffrement asymétrique avec la clef privée de l'auteur du document du résultat du hash.

    Pour vérifier la signature, on déchiffre avec la clef publique puis on hash la partie data comme tu dis et on compare le résultat du déchiffrement avec celui du hash. Si ça correspond alors le document est considéré comme authentique et en provenance de la personne attendue.

    Pour la méthode verify(), il suffit donc de lui passer en paramètre la clef publique de l'auteur et la mécanique interne gère le reste.

    Si la signature ne correspond pas, une SignatureException sera levée.

    Cela ne sert à rien de faire ça manuellement.

    Ceci dit, il est vrai qu'il n'y a pas de distinction explicite entre le fait de déchiffrer correctement le hash contenu dans le certificat (test d'identité de l'auteur), et le test de comparaison des hashs ni dans la javadoc, ni dans les tutoriaux/livres que j'ai pu lire sur le sujet ce qui peut prêter à confusion.

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut
    Merci pour vous,

    En fait, à partir de ce que vous avez viens de dire, vous avez expliqué mon probleme en globale c'est à dire:
    1. Appliquer la fonction de hachage sha1 sur la partie data.
    2. Déchiffrer (avec RSA) la signature avec la clé publique de mon emtteur de certificat.
    3. Comparer les deux résultats pour la verification de l'intégrité.

    Mais mon probleme c'est pas la vérifiction exactement (c'est à dire la fonction verify())plus tot que:
    - Comment je peux obtenir la partie Data de mon certificat et la signature (j'ai cherché des commandes openssl pour l'extraction de ces deux parties, mais j'ai rien obtenir)?
    - Est ce qu'il y a des fonction de chiffrements et dechiffrement en java?
    - Et comment je peux appliquer la fonction de hachage sur la partie data?

    J'esper que j'etais claire,
    En faite, j'ai fais pas mal de recherche mais j'ai trouvé des resultats en vague ?
    Merci encore .

  7. #7
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Mais quel est l'intérêt de hasher la partie data puisque .verify() te fait le boulot ?

    Tu devrais lire en détail les spécifications des certificats (RFC 3280) et le fonctionnement de la JCE.

    Pour tes questions plus précisément :

    - Comment je peux obtenir la partie Data de mon certificat et la signature (j'ai cherché des commandes openssl pour l'extraction de ces deux parties, mais j'ai rien obtenir)?
    Pour la signature ben ya la méthode .getSignature() de X509Certificate.
    Pour la partie data je sais pas (getEncoded() de Certificate ?) mais je te suggère vraiment de lire la RFC 3280 puisque tu sembles décidée à vouloir faire ça manuellement. Je ne suis pas certain que tous les champs du certificat soient impliqués lors de la signature.

    Est ce qu'il y a des fonction de chiffrements et dechiffrement en java?
    Oui, c'est dans la Java Cryptography Extension (JCE).

    Et comment je peux appliquer la fonction de hachage sur la partie data?
    Tu trouveras facilement sur ce forum des sources tout prêts pour hasher des données, reste à déterminer quelle partie d'un certificat est impliquée là dedans et comment l'extraire.

  8. #8
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Pour récupérer la partie data utilisée pour la signature essaye la méthode getTBSCertificate().

  9. #9
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut
    Voila j'ai pu extraire la signature et l'afficher mais j'ai pas pu le dechiffrer.
    Le code de dechiffrement de la signeture est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // déchiffrement de la valeur
    			Cipher cipher = Cipher.getInstance("RSA", "BC");
    			cipher.init(Cipher.DECRYPT_MODE, pkPublicKey);
    			byte[] byHashDecoded = cipher.doFinal(byTabHashValue);
    			System.out.println("Valeur de signature du certificat déchiffrée :");
    	                         for(int i=0; i<byHashDecoded.length;i++)
    			 {
    			    System.out.print(byHashDecoded[i]);
    			 }
    Les erreurs lors de la compulation:
    cannot resolve symbole class Cipher
    cannot resolve symbole variable Cipher
    cannot resolve symbole variable Cipher
    Noter: byTabHashValue c'est le tableau qui contient la valeur de la signature (c'est à dire la valeur chiffré).
    Et j'ai fait l'importation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import javax.crypto.Cipher;
    Est ce qu'il y a de solution pour ce code???????????????????
    Merci d'avance.

  10. #10
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut
    Bonjour,

    Voila j'ai trouvé une commande openssl avec laquelle on peut hasher la partie Data:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    openssl sha1 nom_fichier
    Donc, maintenant il reste le probleme de l'extraction de la partie data pour appliquer cette commande.

    Merci d'avance.

  11. #11
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Puisque tu veux pas lire la RFC 3280 je te fais la lecture :

    4.1.1.3 signatureValue

    The signatureValue field contains a digital signature computed upon
    the ASN.1 DER encoded tbsCertificate. The ASN.1 DER encoded
    tbsCertificate is used as the input to the signature function.
    This
    signature value is encoded as a BIT STRING and included in the
    signature field. The details of this process are specified for each
    of algorithms listed in [PKIXALGS].

    By generating this signature, a CA certifies the validity of the
    information in the tbsCertificate field. In particular, the CA
    certifies the binding between the public key material and the subject
    of the certificate.
    En gros la partie tbsCertificate encodée en DER est la partie du certificat qui est signée par l'émetteur de ce certificat.

    Donc c'est bien la méthode getTBSCertificate() qui te renvoie la partie que tu appelles "data".

  12. #12
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut
    Bonjour et merci beaucoup meme pour la lecture de la RFC 3280 ,

    Bon voila le resultat que j'ai obtenu:

    la longueur de la partie Data:1204

    Valeur de la partie data du certificat est:
    48-1264-80-96321221048136942-12272-122-9131145048-127-11449114896385461928478491
    34811638541019465786769491748156385411198657867693287696649554853638543194665103
    10111099101327897116105111110971081013210010132671011141161051021059997116105111
    110326910810199116114111110105113117101493648346942-12272-122-913191222197110991
    01649910111411610510210599971161051111104611611048302313485048565049485753564952
    9023135155485649504857535649529048-127-11449114896385461928478491348116385410194
    65786769491748156385411198657867693287696649554853638543194665103101110991013278
    97116105111110971081013210010132671011141161051021059997116105111110326910810199
    116114111110105113117101493648346942-12272-122-913191222197110991016499101114116
    10510210599971161051111104611611048-12613448136942-12272-122-913111503-126115048
    -1261102-126110-69-6319-7384125113-98202367-54011282-123114-115-63844-83-64-98-8
    459106-12816-6-127-127-64-30-117120-1-21210411951-66-77-77112-126496-12-88-42116
    57-35-3412125811627-125115-85-341156498-79-66733679-116-7123541511124-82-632130-
    7923-54-101-126-3686-59102-110-39-84-12020-1311255-3697-219413-3789-39489-125-10
    2-108-109-59-92-44-11269701345-11952-7941256989-120-115-60-491032-55-40-26-70-98
    68-86-62-92124-10969-79-96126120-64105-4-117-11978-8164-23-123-42-27-122-9363124
    -70-103-112-84-2574-4822-25-1127852-15-4839-3353-82-124-9764664-772588-107-11114
    12084-961181787-4513-121-16285569-118-46-43-361021593-98640-74-12853123-75104296
    38299844110485520-1131042-65-73-1580-171011910181-35-896497104103-2123101-93-126
    24548-12624148156385291911-14548311-1482963852914422420-98-63135173121-85-77-79-
    10969651-8710668-12-80-1255148-127-69638529354-127-7748-127-80-12820-98-63135173
    121-85-77-79-10969651-8710668-12-80-12551-95-127-108-92-127-11148-127-1144911489
    63854619284784913481163854101946578676949174815638541119865786769328769664955485
    36385431946651031011109910132789711610511111097108101321001013267101114116105102
    1059997116105111110326910810199116114111110105113117101493648346942-12272-122-91
    3191222197110991016499101114116105102105999711610511111046116110-126104811638529
    1544321-584832638529174254823-12721971109910164991011141161051021059997116105111
    110461161104832638529184254823-1272197110991016499101114116105102105999711610511
    11104611611048176996-122721-122-8661144320748716385293146448624860-9658-9656-122
    54104116116112115584747119119119469910111411610510210599971161051111104611611047
    9910310545981051104711211798479911410847999799114108469911410848696996-122721-12
    2-866144562254104116116112115584747119119119469910111411610510210599971161051111
    10461161104799103105459810511047112117984799114108479997991141084699114108486969
    96-122721-122-866134562254104116116112115584747119119119469910111411610510210599
    97116105111110461161104799103105459810511047112117984799114108479997991141084699
    114108

    Press any key to continue...
    Ok maintenant, aprés extraction de la partie data, comment je peux rediriger le resultat obtenu dans un fichier text pour appliquer la commande opnssl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    openssl sha1 nom_fichier
    Merci encore.

  13. #13
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut
    Alors c'est bon j'ai rediriger le resultat vers un fichier texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    byte[] TabDataValue = null;
    TabDataValue = cert.getTBSCertificate() ;
    PrintWriter out =  new PrintWriter (new FileWriter ("Data.txt")) ;
    for(int i=0; i<TabDataValue.length;i++)
     {
       out.print(TabDataValue[i]);
     }
    out.close();
    Et j'ai appliqué la fonction de hashage sur ce fichier (càd le fichier "Data.txt"), en utilisant la commande openssl
    Mais, j'ai obtenu un resultat un peu bizare :
    SHA1(fichier.txt)= 287387197a362f40eae9c2586cc3ebe1c6878ad3
    Donc, je suis tres reconnaisante si qq1 pourra me dire si c'est juste ou pas, car je suis un peu héstée.

    Merci bien d'avance.

  14. #14
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Il n'y a que toi qui a la réponse à cette question puisqu'il n'y a que toi qui dispose du fichier Data.txt et qui donc peut le hasher.

    En tout cas, ton résultat ressemble bel et bien à un hash SHA-1 valide (40 caractères)...

  15. #15
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut
    Oui vous avez raison .
    Mais vous aussi pourrez copier la valeur de la partie Data que j'ai envoyé precedement, et vérifier .
    En tout cas Merci beaucoup pour vous.

    Et maintenant on va revenir au déchiffrement de la signature qui ne veut pas marché.
    En fait, au cours de mes recherches sur Net je trouve ce lien et je crois qu' il peut m'aider: http://juliusdavies.ca/commons-ssl/j...l/OpenSSL.html

    Je vais voir , s'il peut resoudre ce probleme.

    Merci bien pour vous.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/09/2007, 13h35
  2. Vérifier l'intégrité d'une adresse mail
    Par chemouz dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 24/07/2007, 07h19
  3. Vérifier la validité d'un certificat
    Par miloux32 dans le forum Sécurité
    Réponses: 2
    Dernier message: 23/07/2007, 11h09
  4. Vérifier l'intégrité du disque
    Par Giovanny Temgoua dans le forum Windows XP
    Réponses: 7
    Dernier message: 28/09/2006, 10h46
  5. Vérifier l'intégrité d'un mail
    Par mister3957 dans le forum Windows
    Réponses: 2
    Dernier message: 07/06/2006, 11h35

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