Par Catageek, dimanche 4 juin 2006 à la maison :: Sécurité informatique :: Lien permanent
Chiffrer des fichiers simplement avec OpenSSL, sans avoir à installer GnuPG, c'est simple. Une petite application sous KDE, et vous chiffrez et déchiffrez rapidement en utilisant simplement votre souris.
En 2 scripts de 3 lignes, plus 3 ou 4 lignes de commande, vous protégerez vos données confidentielles, et ne les révelez que quand vous en avez vraiment besoin. Un must !
Cela faisait longtemps que je voulais mettre en place un système de chiffrement simple pour des fichiers confidentiels, à la manière de SecurityBox ou Utimaco.
Les solutions habituelles proposent de créer un espace chiffré (partition en général) dans lequel seront placés les documents à protéger. Ceci ne me convenait pas car cela nécessitait de prévoir l'espace disque nécessaire aux données chiffrées, même s'il n'est pas complètement utilisé, et implique généralement la réorganisation de disques durs et le déplacement de données. Je voulais un système qui soit transparent vis-à-vis de l'emplacement et du volume des données à chiffrer, donc pas d'espace dedié.
Voici donc une implémentation très simple s'inspirant de gnupg, sans la lourdeur de gnupg. Les fichiers sont chiffrés sur place, donc il est inutile de changer quoi que ce soit dans l'organisation de nos données : on chiffre ce qu'on veut, où on veut.
Nous aurons besoin d'un seul composant : openssl, disponible sous linux et Windows. Nous utiliserons aussi wipe pour détruire de manière efficace les fichiers, mais ce n'est pas obligatoire.
Comme d'habitude, j'illustrerais mon propos avec une application sous Linux et KDE.
Description
Nous utiliserons le schéma classique de chiffrement, composé d'un protocole de chiffrement symétrique pour le chiffrement des données, et un protocole de chiffrement asymétrique pour le chiffrement des clés de ce dernier.
Le protocole de chiffrement symétrique choisi dans l'exemple est l'AES 256, utilisant une clé de chiffrement de 256 bits.
Celle-ci peut être générée par Openssl à partir d'un mot de passe généré aléatoirement. L'algorithme utilisé par Openssl pour cela réduit la taille de la clé à 160 bits, du fait de son implémentation utilisant l'algorithme de hachage SHA-1. En effet, SHA-1 produit un hash de 160 bits, seule partie aléatoire du schéma de chiffrement. Il ne s'agit donc pas réellement d'un AES 256 du point de vue de la force de la clé. Toutefois, 160 bits est une longueur de clé amplement suffisante en chiffrement symétrique.
J'ai préferé implémenter un vrai chiffrement 256 bits, c'est pourquoi nous n'utiliserons pas un mot de passe, mais nous injecterons directement une clé aléatoire dans Openssl.
Le générateur pseudo-aléatoire utilisé sera /dev/random. /dev/random a pour particularité de ne fournir un flux de caractères pseudo-aléatoires que si un certains nombres de données empiriques sont disponibles : le flux s'arrête donc en cas d'inactivité du disque ou de la souris, entre autres. C'est pourquoi il est nécessaire de bouger la souris, ou mieux, de lancer une lecture intensive du disque (genre cat *.mp3 > /dev/null) lorsque l'on génère des données aléatoires, c'est-à-dire à chaque fois que l'on chiffrera un fichier.
Le protocole de chiffrement asymétrique est le classique RSA, avec une paire de clés de 2048 bits qui est générée une fois pour toute. C'est cette clé, ou plus précisément la partie privée, qu'il faut protéger.
La méthode est simple : nous générons une clé de chiffrement aléatoire, que nous utilisons pour chiffrer les données. Puis nous la chiffrons avec RSA et la stockons dans un fichier caché dans le même répertoire que le fichier chiffré. bien sûr, nous supprimons le fichier en clair une fois le chiffrement effectué.
Génération de la clé de chiffrement
Je suppose que vous avez déjà Openssl installé.
On commence par générer la paire de clés RSA de 2048 bits. On protégera la clé privée par un chiffrement AES256, il faudra donc fournir (et retenir) un mot de passe.
Nous initialisons le générateur de clé d'openssl avec une graine de 1024 caractères tirés de /dev/random.
$ mkdir -p ~/ssl $ mkdir -p ~/ssl/private $ chmod 700 ~/ssl/private $ cd ~/ssl/private $ head -c 1024 /dev/random > seed_rsa $ openssl genrsa -rand seed_rsa -out chiffrement_priv.key -aes256 2048
On extrait la clé publique dans un fichier à part
$ openssl rsa -pubout -in chiffrement_priv.key \ -out ../chiffrement_pub.key
Script de chiffrement
chiffre.sh : (à télécharger ici)
#!/bin/bash
IFS=$'\n'
DIR=$(dirname ${1})
FILE=$(basename ${1})
if [ ! -f ${1} ];
then
echo "Le fichier '$1' n'existe pas."
exit 0
fi
if [ -f ${1}.aes ];
then
echo "Il existe déjà un fichier chiffré portant le nom '${1}.aes'. Opération annulée."
exit 0
fi
if [ -f ${DIR}/.${FILE}.aes.key ];
then
echo "Il existe déjà un fichier de clé '.${FILE}.aes.key'. Veuillez le déplacer ou le supprimer."
exit 0
fi
echo "Utilisez votre souris pour générer des données aléatoires :"
# On génère à la volée une clé de session et un IV pseudos-aléatoires
# Chiffrement du fichier avec la clé de session, puis de la clé de session avec la clé RSA
# La clé de session chiffrée est sauvegardée dans .nom_fichier.aes.key,
# et le fichier en clair est détruit
openssl enc -p -e -aes-256-cbc -nosalt -in $1 -out $1.aes -K $(cat /dev/random | od -A n -t x -N 32 -w | tr -d ' ') \
-IV $(cat /dev/random | od -A n -t x -N 16 -w | tr -d ' ') \
| cut -d'=' -f2 | openssl rsautl -encrypt -pubin -inkey ~/ssl/chiffrement_pub.key \
-out ${DIR}/.${FILE}.aes.key && (cd ${DIR} ; wipe ${FILE})
Script de déchiffrement
dechiffre.sh : (à télécharger ici)
#!/bin/bash
IFS=$'\n'
DIR=$(dirname ${1})
FILE=$(basename ${1})
if [ -f ${DIR}/${FILE} ];
then
echo "Il existe déjà un fichier nommé '${FILE}'. Opération annulée."
exit 0
fi
# Déchiffrement de la clé de session avec la clé RSA, puis déchiffrement du fichier
# avec la clé de session
# La clé de session et le fichier chiffré sont détruits
SECRET=$(openssl rsautl -decrypt -inkey ~/ssl/private/chiffrement_priv.key -in ${DIR}/.${FILE}.aes.key)
KEY=$(echo ${SECRET} | cut -d' ' -f 1)
IV=$(echo ${SECRET} | cut -d' ' -f 2)
if (openssl enc -d -aes-256-cbc -K ${KEY} -iv ${IV} -in ${DIR}/${FILE}.aes -out ${DIR}/${FILE});
then
rm -f ${DIR}/${FILE}.aes ${DIR}/.${FILE}.aes.key
else
echo "Ce n'est pas la bonne clé"
rm ${DIR}/${FILE}
exit 0
fi
Utilisation
On placera les scripts dans le répertoire /usr/local/bin, par exemple.
Pour le chiffrement :
$ chiffre.sh fichier
Ceci produit les fichiers fichier.aes et .fichier.aes.key, respectivement le fichier chiffré et la clé de session associée, chiffrée elle aussi.
Pour le déchiffrement :
$ dechiffre.sh fichier.aes
Après nous avoir demandé le mot de passe de la clé de chiffrement, le fichier sera déchiffré.
Intégration dans KDE
Déchiffrement automatique
On créera une association de fichier pour le type MIME application/aes, pour l'extension *.aes. On pourra y associer aussi une icone. Moi j'ai pris un cadenas !
On y associera l'application dechiffre.sh, à exécuter dans un terminal. Dans les options avancées, désactiver le suivi d'exécution pour que KDE n'attende pas la notification de chargement qui ne viendra jamais.
Menu contextuel
On créera le fichier :
/usr/kde/3.5/share/apps/konqueror/servicemenus/chiffrement.desktop :
[Desktop Entry] ServiceTypes=all/allfiles Actions=Chiffre [Desktop Action Chiffre] Name=Encrypt... Name[fr]=Chiffrer... Exec=/usr/local/bin/chiffre.sh %f
Ceci ajoutera un menu contextuel dans Konqueror (clic droit). On n'oubliera pas d'ajuster les droits sur le fichier :
$ su - # chown root:root chiffrement.desktop # chmod 644 chiffrement.desktop
Conclusion
Avantages
- Simple à mettre en oeuvre, facile d'utilisation. Un seul mot de passe à retenir.
- L'utilisation de clé de session permet de ne pas avoir à tout rechiffrer en cas de changement de clé RSA, on ne rechiffrera que les clés de session
- En terme de sécurité, si un fichier est décrypté et la clé de session découverte, cela ne remet pas en cause la sécurité du système, car seule une clé aura été découverte.
Inconvénients
- Lors de copie/déplacement du fichier chiffré, il faut penser à prendre le fichier .aes.key associé avec.
- Les sauvegardes à long terme ne sont pas évidentes à mettre en oeuvre.
Todo
- Permettre la copie de plusieurs fichiers
- Gérer le chiffrement d'un groupe de fichiers, ou d'un répertoire, avec la même clé de session, pour des opérations de masse.
- Inclure la clé de session dans le fichier chiffré .aes
- Intégrer la demande du mot de passe dans une fenêtre de Dialogue KDE

Commentaires
1. Le samedi 2 janvier 2010 à la maison, par comment
S'abonner au fil rss des commentaires de ce billet
Ajouter un commentaire