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 :

BouncyCastle: PKCS#7 + message digest MD5: comment vérifier la signature ?


Sujet :

Sécurité Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Par défaut BouncyCastle: PKCS#7 + message digest MD5: comment vérifier la signature ?
    Bonjour,

    J'utilise la librairie BouncyCastle pour la première fois, et je n'ai pas fait des tonnes de crypto avant... mon pb est donc peut-être tout simple, mais je ne comprends pas comment le résoudre... :-(

    Je suis en train de développer un bout de code qui doit vérifier la signature de 6 paramètres envoyés par un client tiers.

    Les spécifications du client sont:
    - 6 mots (texte pur) sont utilisés pour générer un message digest avec l'algorithme MD5
    - ce message digest est ensuite signé avec PKCS#7
    - la clé publique est un certificat X.509 v3 (stocké sur le serveur)

    Côté serveur, je reçois les 6 mots en texte clair et la signature générée par PKCS#7.

    J'ai deux questions:
    1. est-ce que l'idée de base de mon code est correcte:
    - regénérer le message digest sur la base des 6 mots
    - confronter la signature reçue avec ce message digest

    2. quand j'exécute mon bout de code, j'ai une exception: SignatureException: content hash found in signed attributes different.
    Je ne comprends pas ce qu'elle signifie :-( (Google ne m'a pas été d'un grand secours sur ce coup).
    Est-ce que quelqu'un pourrait m'expliquer ce que ça veut dire et comment résoudre ce problème ?

    Merci beaucoup !!!!

    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
    	public static boolean checkSign(String word1, String word2, String word3, String word4, String word5, String word6, String receivedSignature) {
    		// Add a Bouncy Castle security provider
    		Security.addProvider(new BouncyCastleProvider());
    		FileInputStream certifIS = new FileInputStream("myCert.cer");
     
    		CertificateFactory cf = CertificateFactory.getInstance("X.509");
    		Collection c = cf.generateCertificates(certifIS);
    		certifIS.close();
    		Iterator iterator = c.iterator();
    		X509Certificate cert = null;
    		while (iterator.hasNext()) {
    		   cert = (X509Certificate)iterator.next();
    		}
     
    		MessageDigest sha = MessageDigest.getInstance("MD5");
    		sha.reset();
    		sha.update(word1.getBytes());
    		sha.update(word2.getBytes());
    		sha.update(word3.getBytes());
    		sha.update(word4.getBytes());
    		sha.update(word5.getBytes());
    		sha.update(word6.getBytes());
    		byte[] hash = sha.digest();
     
    		byte signedContent[] = Base64.decode(receivedSignature);
    		CMSSignedData signedData = new CMSSignedData(signedContent);
     
    		if (signedData.getSignedContent() == null){
    			CMSProcessableByteArray process = new CMSProcessableByteArray(hash);
    			signedData = new CMSSignedData(process, signedContent);
    		}
     
    		SignerInformation signer = (SignerInformation) signedData.getSignerInfos().getSigners().iterator().next();
     
    		boolean isOk = signer.verify(cert, "BC");
    		return isOk;
    	}

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Par défaut
    Bonjour,

    Je n'ai pas avancé sur mon problème... est-ce que vraiment aucun d'entre vous n'a un input à me donner ? :$

    Je pense que ma méthodologie est mauvaise, mais je ne comprends pas comment faire autrement.
    Si je fais écrire le contenu binaire de mon hash, j'ai:

    e77bffb6071dc925f9428b3eee1c5fd4

    et le contenu binaire de ma signature décodée en base 64 est:

    3082019506092a864886f70d010702a082018630820182020101310b300906052
    b0e03021a0500300b06092a864886f70d010701318201613082015d0201013013
    300e310c300a06035504031303494433020100300906052b0e03021a0500a05d3
    01806092a864886f70d010903310b06092a864886f70d010701301c06092a86488
    6f70d010905310f170d3038313231313134323832375a302306092a864886f70d0
    1090431160414a7fe0d7d212e353677ca8b9efe254665b6a70d583081a706052b0
    e03021b30819d024101242511cffa637b77c9a2c1330de790944a6a374cef16182
    c6063ad535f993eecd5385cf7f54d42e3c371a86f06895f5de4aae3e17d55e4fa05
    72e3a9f8230de102150149efd01780548fea49385f51381338bbe144580f024100f
    899225bac00634d45ab96702d7bca52db64eae3f14f3bb8c74aa8e28d41df5ca4e
    b1cbd4e12a57749559c172e63fdca81817ff39bc435d8f169fcf8ce861fa7042f302
    d021500932cf82c0e153f0be298ba39839997c83d13d8ea021422c23c3d5a30e7
    c7109f2cd6924b9220f1c8ce5f

    Clairement, le hash n'est pas le même... est-ce que je dois extraire quelque chose de la signature ? ou est-ce que je dois appliquer une transformation à mon hash ?

    D'avance, merci de toute aide ;-)

  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
    La 2ème valeur que tu as posté sur ton 2ème message n'est pas un hash MD5. Un hash MD5 est limité à 32 caractères hexa. Je suppose que ta 2ème valeur est chiffrée.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Par défaut
    Citation Envoyé par Marco46 Voir le message
    La 2ème valeur que tu as posté sur ton 2ème message n'est pas un hash MD5. Un hash MD5 est limité à 32 caractères hexa. Je suppose que ta 2ème valeur est chiffrée.
    Oui, effectivement, elle est chiffrée... d'où le certificat passé en paramètre dans la méthode signer.verify(cert, "BC");
    Non ?

    Merci !

Discussions similaires

  1. Comment vérifier si Excel est installé ?
    Par mathieutlse dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 16/08/2017, 18h49
  2. Comment vérifier que la valeur d'un champ soit unique?
    Par le lynx dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/05/2005, 14h11
  3. Réponses: 3
    Dernier message: 05/04/2005, 14h36
  4. Réponses: 11
    Dernier message: 27/03/2005, 15h13
  5. comment vérifier qu'une table esclave vérifie une condition?
    Par loikiloik dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/04/2004, 16h48

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