+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Membre Expert
    Avatar de Rakken
    Inscrit en
    août 2006
    Messages
    1 254
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 1 254
    Points : 1 252
    Points
    1 252

    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 expérimenté

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

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

    Informations forums :
    Inscription : novembre 2009
    Messages : 377
    Points : 563
    Points
    563

    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 Expert
    Avatar de Rakken
    Inscrit en
    août 2006
    Messages
    1 254
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 1 254
    Points : 1 252
    Points
    1 252

    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 expérimenté

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

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

    Informations forums :
    Inscription : novembre 2009
    Messages : 377
    Points : 563
    Points
    563

    Par défaut

    Code :
    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 actif

    Inscrit en
    février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : février 2004
    Messages : 342
    Points : 165
    Points
    165

    Par défaut

    ce n'est pas du code C, mais ca permet de faire des essais

    Code :
    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 Expert
    Avatar de Rakken
    Inscrit en
    août 2006
    Messages
    1 254
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 1 254
    Points : 1 252
    Points
    1 252

    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 Expert
    Avatar de Rakken
    Inscrit en
    août 2006
    Messages
    1 254
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 1 254
    Points : 1 252
    Points
    1 252

    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++ :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •