9

Mise à jour: le script a été mit à jour, les possibilités et commandes ont légèrement changé, lisez le README pour plus de détail ou suivez mes annonces avec le tag smailarchiver.

Faisant un peu le nettoyage dans mes boites à emails, j’ai voulu sauver tous mes vieux messages avant suppression. Cependant, je voulais un moyen de faire cela de manière automatisée (possible d’utiliser cron), incrémental (ne pas tout retélécharger à chaque fois), supportant la compression et surtout garder une certaine confidentialité (chiffrement).

J’ai trouvé des bouts de codes pour faire chaque partie séparément (ici et ici par exemple) mais pas de programme permettant de faire tout cela ensemble. A que cela ne tienne, j’ai donc créé un petit script python contentant mes besoins. Ainsi est né SMailArchiver (avec S pour Secured ou Suicide, question de point de vue) que je partage ici.

Ce petit bout de code (approchant des 400 lignes de python) permet facilement de faire des backup de plusieurs comptes emails avec toute une série d’option comme la compression des mails avant le chiffrement (une compression après le chiffrement pourrait également être utile mais est moins efficace) ou le choix d’une clef constituée uniquement de bytes aléatoires ou renforcée par un mot de passe de votre choix. Le chiffrement se fait avec AES 256 avec une signature HMAC-SHA256 histoire d’empêcher les manipulations. C’est pas Truecrypt mais ça suffit pour cacher les conversations avec votre maitresse des yeux indiscrets de madame votre femme (ou inversement).

big mess

Avant d’utiliser SMailArchiver, ma gestion des emails ressemblait à ça… et mes cheveux étaient secs et cassants.

Le programme peut recevoir les paramètres nécessaires par la console, via des arguments ou via un fichier de config (regardez le fichier d’exemple dans le dépot).

$ python smailarchiver.py 
Enter your email username: foo@bar.com
Enter your imap server: imap.bar.com
Enter your password: 
Enc key: 6MIiWqNiJ4h1qDmp5Z4OpWKRLst7eAbirWOPHIm9zqk=
Sig key: 9JmR0593CWwtnJhRWqdLHk7tXvX/h6l6A2GLKA4iVq4=
$ python smailarchiver.py --user foo@bar.com --imap imap.bar.com --passwd monkey1 --key foo@bar.com.keys --promp --compress
Enter your encryption/signature password: 
Enc salt: KNwhv7kuNs0/iCZZTUyd05IuOylzG/n2oBALj1UMJ0c=
Sig salt: A99CxfzwRbU4P4lse6eN5O+g2wethRzL4gMH7xqFkgE=
Hash: oNcX7GAyHsS+bNOT8UCYAYM/ltCmx34E9Gmmpky02AE=
$ python2 smailarchiver.py -c config.json
Enter your encryption/signature password: 
Enc salt: m87TeE9fmr5XPf7yvN0w3PYOv3ivlNKpKGp35hC+N/k=
Sig salt: 2k9Wu5HBEo7G0J0EzlglOqV0Zko1LmhfiGnxD2QEzhE=
Hash: FA3TdkhWNZqy9BjGOk2UVZ6AeqgHSrparH3ynHdvj38=
$ python2 smailarchiver.py --decrypt foo@bar.com/ --key foo@bar.com.keys --promp
Enter your encryption/signature password: 
Decrypting 16.gz.mbox
Decrypting 11.gz.mbox
Decrypting 45.gz.mbox
...

Code évidement open source que vous pouvez trouver le code sur mon dépot gitorious. C’est compatible python 2.7 et plus (python 3 c’est l’avenir !) et nécessite pycrypto (qui est compatible python 2.1 et 3.2, j’imagine même pas le bordel que ça doit être). Mes tests très scientifiques type àvuedenezçapasse montrent que le programme fonctionne mais on est jamais à une erreur prêt, n’hésitez pas à me communiquer vos idées d’améliorations ou corrections.

PS: fait amusant concernant AES 256, saviez vous que l’énergie contenue dans une supernova ne suffirait pas rien que pour énumérer les 2²⁵⁶ états possibles (calcul non compris donc). A moins de trouver une faille de sécurité, il est donc impossible, avec les notions de la physique actuelle, de faire un brute force sur une clef AES 256. Source: Applied Cryptography, Bruce Schneier (extrait en question).

9 commentaires

  1. Gounlaf dit :

    Bonjour,

    est-ce que votre script récupère également les « attachments » ?

    Merci d’avance

  2. mart dit :

    @Gounlaf les pièces jointes sont en fait en bas64 dans la source du mail (un beau bordel qui rend compréhensible les limites de taille). Les mails étant sauvés au format mbox avec cette pièce jointe, elles seront récupérables dès l’importation du fichier .mbox déchiffré.

  3. djipey dit :

    Très bon script, il marche bien. J’aime bien le fait de pouvoir tout spécifier dans la config, sauf le mot de passe, et qu’il te le demande quand même. Bon je galère un peu à ouvrir les mbox avec Evolution, donc je voudrais savoir, est-ce que ça récupère tous les dossiers d’une boîte mail ?

  4. mart dit :

    @djipey : j’ai préféré obliger à taper le mot de passe pour plus de sécurité. Pour ceux qui veulent faire tout automatiquement, il suffit de désactiver l’option promp, le secret est donc uniquement le fichier {keys} de bytes aléatoires (à protéger soit même). La possibilité de spécifier un mot de passe de déchiffrement mais d’inscrire ce dernier dans un fichier texte me semblait un peu contre-productive.

    Les emails que tu importes dépendent du dossier IMAP que tu choisis. Par défaut il s’agit du dossier INBOX. Dans le cas de Gmail, tu voudrais par exemple importer le dossier '"[Gmail]/All Mail"' (guillemets important, regarde la ligne 296). Rien n’empêche également de faire deux config pour le même email en changeant juste le dossier IMAP (attention que tous les emails seront mélangés dans le même dossier {user}/). Je vais essayer d’expliquer ça plus en détail dans le fichier README edit: fait.

    Tu as un problème à l’importation des fichiers déchiffrés ? N’hésite pas à me faire remonter par mail si tu as un soucis avec le script, c’est tout à fait possible. Les emails sont également mélangés au déchiffrement (le ls de python ne respecte pas d’ordre) mais je ne pense pas que ça doit poser un problème.

  5. […] Faisant un peu le nettoyage dans mes boites à emails, j’ai voulu sauver tous mes vieux messages avant suppression.  […]

  6. djipey dit :

    Désolé pour la latence, je n’ai pas reçu de notification. Oui je me suis mal exprimé, c’est parfait qu’il te demande le password en prompt :). Le mettre dans le fichier texte n’aurait pas été bien.

    En ce qui concerne l’import, non c’est de ma faute, je n’ai pas fait attention qu’il fallait obligatoirement décrypter les fichiers. En fait, il faut décrypter le dossier généré avec les mbox pour avoir un fichier mbox final importable. Du coup, il n’y a aucun moyen de créer une archive en clair ? Parce que si on perd les clés, on ne peut plus rien faire, non ?

  7. mart dit :

    @djipey en effet, si tu veux garder tes messages en clair tu dois importer (et donc chiffrer) et directement déchiffrer. Tu voudrais une option pour stocker les messages en clair ou utiliser uniquement un mot de passe (et pas de clefs générée) ? Les deux ne devraient pas demander trop de changements.

    Oui si tu perds tes clefs tu ne peux plus rien faire mais en soit si tu utilises salt+mot de passe, le fichier généré n’est plus un secret et tu peux le laisser à coté des mails chiffrés (je ne vois donc pas trop pourquoi tu perdrais le fichier de salt et pas les mails chiffrés).

  8. […] Faisant un peu le nettoyage dans mes boites à emails, j'ai voulu sauver tous mes vieux messages avant suppression. Cependant, je voulais un moyen de faire cela  […]

  9. […] (20130125_090144) Un script de sauvegarde de mail en python chiffré par mart-e ! Je n'ai pas (encore) testé, mais ca a l'air très prometteur ! [lien] […]

css.php