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é Discussion :

Encryptage / décryptage en RSA avec OpenSSL


Sujet :

Sécurité

  1. #1
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut Encryptage / décryptage en RSA avec OpenSSL
    Bonjour,

    Alors voilà, on vient de me demander d'encrypter / décrypter des mots de passe avec openssl. Je dispose d'un certificat "cert.pem" et de la clef publique "pkey.pem", sous forme de fichier.

    Le problème, c'est que c'est la toute première fois que je fais ça (usuellement, j'utilise md5(monPassword) et point barre, mais là, faut que ce soit réversible) je ne trouve aucun exemple un tant soit peu clair pour faire l'encryptage/décryptage.
    Intuitivement, je m'attendait à un truc du genre "char *encryptRsa(char *publicKey, char *stringToEncrypt)", mais visiblement, c'est bien plus complexe que ça...

    J'essaie depuis hier de torturer la maigre doc d'OpenSSL pour arriver à quelque chose, mais pour l'instant sans le moindre succès...

    Merci d'avance !

    ps : pour info, c'est en c++/qt que je dois coder ça.
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  2. #2
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut
    Salut,

    que veux-tu faire exactement ? Des mots de passes réversible sont vraiment une très mauvaise pratique. Si tu dois le faire il faut que tu ailles des impératifs important et pas juste un password recovery.

    Sinon pourquoi utiliser du RSA ? Si c'est pour utiliser une autorité de certification, ou un certificat auto-signé entre deux équipements oui. Si c'est uniquement pour chiffrer utilise un algorithme symétrique, c'est plus simple.

    (l'avantage d'utiliser RSA, sur des systèmes linux c'est que la gestion des fichier .pem et cert est déjà implémenté.)

    [EDIT]
    Un code de test qui fait plus ou moins ce que tu veux je pense, par contre je n'ai ni regardé, ni testé son code.

    http://jeanrola.schuler.home.hefr.ch..._asymmetric%2F

    [/EDIT]

    p.s. Une petite remarque sur le fait de faire un md5(password) :

    1. On utilise un sel (d'une certaine longueur) + password pour éviter les attaques par dictionnaire et/ou rainbow.

    2. On change de graine pour chaque password, afin de forcer l'attaquant à refaire un dico/rainbow pour chaque password

    3. On utilise pas md5, qui devient vieux , il y a bcrypt qui est fait pour cela et PBKDF2, à la limite un sha256/512.

    4. On effectue un hash en boucle hash(hash(...(sel + password))), je n'arrive malheureusement pas à remettre la main sur la recommandation du nombre d'itérations, mais sur du sha256 il faut en faire plusieurs milliers par exemple. Ceci afin de rendre le brute-force plus cher.

    Un papier de recommandation du NIST :
    http://csrc.nist.gov/publications/ni...-sp800-132.pdf

  3. #3
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Ce n'est pas juste un password recovery, en fait, je bosse sur un équipement embarqué. En interne tous ses mots de passes sont actuellement stockés en clair dans une base sqlite et envoyé à divers webservices en clair.

    Le but est que le stockage des mdp en local se fasse de manière crypté. Par contre, le problème est que les webservices ne vont pas évoluer avant plusieurs mois (au mieux). Donc pour assurer une continuité de service, il faut absolument que le mot de passe soit décrypté juste avant d'être envoyé (on est bien d'accord qu'au niveau sécurité, ça reste... perfectible, mais c'est toujours mieux que d'avoir l'intégralité en clair).

    Les équipements produits possèdent déjà chacun leur "cert.pem" et "pkey.pem" qui est unique à chaque fois. C'est aussi pour ça que cette méthode a été choisie.

    Bref, je vais regarder le code que tu m'as fournis et voir si j'arrive (enfin) à en tirer quelque chose.
    Merci beaucoup !

    ps : Entièrement d'accord pour le md5, je n'avais pas parlé de grain de sable par simplification. Et pour la prochaine fois, j'irai voir du côté des autres solutions que tu as mentionnés ;-)
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  4. #4
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le but est que le stockage des mdp en local se fasse de manière crypté. Par contre, le problème est que les webservices ne vont pas évoluer avant plusieurs mois (au mieux). Donc pour assurer une continuité de service, il faut absolument que le mot de passe soit décrypté juste avant d'être envoyé (on est bien d'accord qu'au niveau sécurité, ça reste... perfectible, mais c'est toujours mieux que d'avoir l'intégralité en clair).
    En faite tu ne rajoute qu'une faible complexité, vu que ta clé est local sur ton système embarqué, si l'attaquant démonte ton système, si il peut récupérer la base de données, il pourra aussi déchiffrer tes mots de passes.

    Donc ce que tu fais est mieux que rien, mais n'assure aucune protection contre un attaquant un peu sérieux. Maintenant avec tes contraintes de développement, j'ai rien de mieux à te proposer, mise à part de faire en sorte que cela soit facilement évolutif vers une solution qui protège au moins le mot de passe de tes clients.

    p.s. Redis moi ce que vaux le code, j'en aurai peut-être besoin dans un avenir proche

  5. #5
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut
    ce n'est pas du code C, mais ca permet de faire des essais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ echo "ceci est secret" > secret.txt
    
    $ openssl smime -encrypt -in secret.txt -out secret.encrypted.pkcs7 -inkey server.key  -aes-256-cbc -binary -outform PEM server.crt
    
    $ openssl smime -decrypt -in secret.encrypted.pkcs7 -inkey server.key -aes-256-cbc -inform PEM
    ceci est secret
    tu encryptes sur la clé publique (tout le monde peut le faire)
    tu decryptes avec la clé privée (seul ta clé peut récupérer le message)

    Note: comme l'a tres bien mentionné manticore, puisque la clé est à coté de la data cryptée, tu ajoutes de la complexité (donc du cout) mais aucune sécurité.

  6. #6
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    p.s. Redis moi ce que vaux le code, j'en aurai peut-être besoin dans un avenir proche
    Je n'ai pas repris le code exactement tel quel, mais avec j'ai réussi à faire le cryptage et le décryptage, donc je dirais que c'est pas mal du tout ;-)

    Résolu. Merci ;-))
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  7. #7
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Bon, le cryptage et le décryptage fonctionnent bien, mais en passant par des fichiers.
    J'ai notamment ce morceau de code :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (len = lenPrivKey; len == lenPrivKey; ) {
            len = fread (pBufCrypt, 1, lenPrivKey, pCryptFile1);
            if (len == lenPrivKey) {
                len1 = RSA_private_decrypt(len, pBufCrypt, pBufClear, pPrivKey->pkey.rsa, RSA_PKCS1_OAEP_PADDING);
                fwrite (pBufClear, 1, len1, pClearFile1);
            }
    }
    ...qui m'écrit dans le fichier "pClearFile1" le contenu de pBufClear (le mot de passe décrypté). Il se trouve que pBufClear est de type "unsigned char *". Ca marche très bien tant que je l'écrit dans le fichier via fwrite, mais comment faire pour obtenir un QString ?
    Je sais que ma valeur est bonne parce que le contenu du fichier est correct, mais pas moyen de convertir cette valeur...
    Quelqu'un aurait une idée ?
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

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

Discussions similaires

  1. Réponses: 28
    Dernier message: 31/05/2012, 08h40
  2. Réponses: 4
    Dernier message: 07/05/2007, 21h05
  3. [VB.NET2.0] cryptage RSA avec clef privée
    Par AP dans le forum Framework .NET
    Réponses: 4
    Dernier message: 17/04/2007, 16h35
  4. Client/Serveur en C avec OpenSSL
    Par baallrog dans le forum C
    Réponses: 2
    Dernier message: 14/01/2007, 06h26
  5. problème avec <openssl/dh.h>
    Par Tex-Twil dans le forum C
    Réponses: 6
    Dernier message: 23/03/2006, 12h30

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