cryptage asymétrique avec clé public et privée à base de zend_framework

Aujourd’hui on va s’amuser un peu avec les clés publics et privées et le cryptage rsa. Tout ça à l’aide d’openssl, php et zend_framework.

Le besoin : Vous voulez communiquer avec une autre société de manière sécurisé. La cryptographie asymétrique est choisie car plus sécurisé que les traditionnels méthode symétrique avec clé secrète type blowfish. Vous générez une clé privée avec sa clé public correspondante, puis transmettez la clé public a l’autre société qui s’en servira pour crypter les messages. A l’aide de votre clé privée, vous seul serez en mesure de décrypter les messages reçue.

Si quelqu’un intercepte le message, sans votre clé privée, il ne pourra rien en faire. Même avec la clé public, il n’est pas décryptable. C’est l’avantage par rapport à la cryptographie symétrique puisque avec cette dernière, on utilise la même clé pour crypter/decrypter

Première étape, se générer une clé privée. Rien de plus facile avec openssl, qui est installé d’office sur toute bonne machine qui se respecte. On vous demandera une passphrase et sa confirmation, qui seront nécessaire à chaque utilisation de la clé privée.

openssl genrsa -des3 -out private.key 1024

« gensra » : pour générer une clé private RSA.
-des3 : choix du cryptage de la clé privée en elle même, ce qui induit une demande de passphrase
-out private.key : spécifie le fichier où sera généré la clé privée.
1024 : taille de la clé privée

un « man openssl » vous expliquera plus en détail les paramètres.

On se retrouve avec un fichier private.key. Par curiosité on peut l’ouvrir, on voit bien l’entête —–BEGIN RSA PRIVATE KEY—– avec ensuite une longue chaîne de caractère. C’est la fameuse clé privée. De cette clé privée, on va produire une clé public. Bien sur, puisque vous utilisez la clé privée et qu’elle est protégée, le système vous redemandera la passphrase.

openssl rsa -in private.key -pubout -out public.key

-in private.key : on déclare en entrée notre clé privée.
-pubout : on demande d’avoir une clé public en sortie
-out public.key : spécifie le fichier où sera généré la clé public

De même, si on l’ouvre, un a bien l’entête —–BEGIN PUBLIC KEY—–.

Dans la théorie, on garde sa clé privée et on transmet une clé public au partenaire avec qui on veut crypter les messages. Pour les tests, nous, tout sera fait dans le même script php. On génère une chaîne quelconque, on l’encrypte à l’aide de la clé public, puis la décrypte avec la clé privée, et finalement on vérifie qu’on a bien les mêmes données au départ et à l’arrivée. On travaille en base64 pour avoir une chaîne qu’on peu facilement transporter en http par exemple.

// message a crypter
$toCrypt = 'crypter avec une clé public / clé privée ?!';

var_dump($toCrypt);

// cryptage du message avec la clé public
$rsaPublic = new Zend_Crypt_Rsa(array(
'pemPath' => './public.key'
));

$stringCrypt = $rsaPublic->encrypt($toCrypt, $rsaPublic->getPublicKey(), Zend_Crypt_Rsa::BASE64);

var_dump($stringCrypt);

// decryptage du message avec la clé privée
$rsaPrivate = new Zend_Crypt_Rsa(array(
'pemPath' => './private.key',
'passPhrase' => 'webozor'
));
$stringDecrypt = $rsaPrivate->decrypt($stringCrypt, $rsaPrivate->getPrivateKey(), Zend_Crypt_Rsa::BASE64);

var_dump($stringDecrypt);

message à crypter

crypter avec une clé public / clé privée ?!

chaîne cryptée en base64

SFddLl7rXZ97H59aD7julhv6ZOEkoUSePuOEy3/d8dXdcP3+wbr>ZDoJa2350DCKzAqB8frqsasxrf18o3qRuUeaEmZ0F6gqizgUdsgn0BrRGETMC9AqbqIakLH3UqydEmvCWyr8bgF7503QfY3fWd7zkzEmr1jBE7e4+r0fKNqTk=' 

message décrypté

crypter avec une clé public / clé privée ?!

On est ok, on retrouve bien notre chaîne en sortie après l’avoir décryptée avec la clé privée et la passphrase.

J’espère que ça vous sera utile.

PS : attention, troll inside

 

copier coller dans une applet java avec ubuntu 64 bits

Depuis que je suis passé de la ubuntu 32 a 64 bit, j’ai un problème pour coller du texte dans les applet java. Impossible d’accéder au clipboard dans une applet java bien que glipper soit installé. Pour être précis en faite, je peux copier coller depuis l’applet et dans l’applet, mais des que ca vient du monde exterieur, bloc note, firefox et autre, rien a faire.

Au hasard de mes recherches, j’ai fini par trouver la solution.

il faut ajouter ces lignes dans le fichier java.policy

grant {
permission java.awt.AWTPermission "accessClipboard";
};

Attention, il y a déjà un bloc grant en général, donc rajouter la ligne de permission suffit. Il y a 2 fichiers java.policy sur le sytem, un pour java-sun et l’autre pour open-jdk. dans le doute j’ai modifié les deux.

/etc/java-6-openjdk/security/java.policy
/etc/java-6-sun/security/java.policy

un locate retourne 4 fichiers, il y a en faite 2 liens symboliques qui pointent vers ces 2 fichiers.

Ubuntu php et userdir

Puisque ça fait 3 ou 4 fois que je change ou réinstalle ma machine et qu’à chaque fois je perds de longues minutes à réinstaller mon environnement. je me décide donc à faire un rapide post sur le sujet.

Pourquoi développer dans ma home plutôt que dans le traditionnel /var/www ?
Regrouper au maximum mes données dans mon répertoire home et du coup simplifier les backups

On commence par créer le répertoire dans son home et lui assigner les bons droits

mkdir /home/votre_login/public_html
chmod -R 755 /home/votre_login/public_html

Explication sur 755 :

7 – tout les droits pour le propriétaire, vous en l’occurrence
5 – droits de lecture et d’accès pour les membres du groupe du propriétaire
5 – droits de lecture et d’accès pour le reste du monde

Maintenant que le répertoire est crée, on ajoute le module « userdir » à apache.

sudo a2enmod userdir

Il ne reste plus qu’a configurer tout ça. Dans un premier temps, on va autoriser toutes les modification via .htaccess. Attention, à ne pas faire en prod, car par exemple on va autoriser le listing des répertoires, ce qui n’est pas jamais bon pour la sécurité.

sudo vim /etc/apache2/mods-available/userdir.conf

AllowOverride All

Dernier problème, autoriser le traitement des fichiers php.

sudo vim /etc/apache2/mods-available/php5.conf

# To re-enable php in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
<Directory /home/*/public_html>
php_admin_value engine Off
</Directory>
</IfModule>

Les commentaires sont clair, il faut commenter les quelques lignes ci-dessus et surtout la ligne qui désactive l’engine php. Il ne reste plus qu’a redémarrer apache via la commande

sudo /etc/init.d/apache2 restart

Vous voila prêt à développer dans votre home

Si vous avez une erreur 403, il se peut que ça soit un problème de droit. Pour vérifier, le plus pratique est de ce mettre à la place d’apache pour tester la lecture du répertoire via deux lignes de commande.

sudo su - www-data
ls /home/votre_login/public_html

PS : il reste un problème à traiter avec la réécriture d’url que j’ai résolu pour l’instant en créant un sous domaine pour les projets important. C’est l’enchaînement ~login -> login/public_html pour la rewrite du htaccess qui poserai problème. si je trouve un solution viable ( ou qu’on m’en propose une ) je mettrai à jour le post.

Pour le sous domaine, j’ajoute un fichier dans /etc/apache/site-available avec un directory qui pointe sur /home/votre_login/public_html/le_projet

sudo a2ensite leprojet
sudo /etc/init.d/apache2 restart

si le domaine pointe sur votre machine, c’est fini, sinon j’ajoute l’entrée dans /etc/hosts

domaine.en.question 127.0.0.1

Merci de m’avoir lu et à bientôt !

Mercurial, bitbucket et fichier hgrc

Pour mettre en place Capistrano dans mon environnement de travail – ubuntu + mercurial – j’ai eu besoin de « pousser » mes sources sur un repository privé, mais accessible en public. Mercurial permet de créer son propre serveur en local prévu pour être interrogeable à distance, mais travaillant d’un portable, les différentes architectures réseau dans lequel j’évolue me demanderai trop de temps à configurer… Je cherchais une solution simple, qui marche quelque soit l’endroit ou je me trouve, du moment que j’ai accès à internet.

Lire la suite »

Zend_Framework, Blowfish et Zend_Filter

Dans cet article, nous allons jouer avec le Zend_Framework et ses filtres.
Plus précisément, Zend_Filter_Encrypt et Zend_Filter_Decrypt.
Nous verrons aussi comment créer ses filtres et chainer les appels.

Le besoin : Créer une url avec une durée de vie définie.

Travaillant pour un société de tirage en ligne, certaines images uploadées par les clients ont une url public.
Pour éviter que les clients hotlink ces images et profite de l’hébergement de la société, on fourni une url à durée de vie limitée de la forme

http://www.webozor.com/image.php?param=SSegseeg7sesegSseofgjsegsegseg6486sef4sefsefijseofseofsef

Lire la suite »

Résolutions année 2011

Bonne année à tous. Je vous souhaite d’abord à tous – bon ok, vous êtes très peu a me lire pour l’instant mais quand même… – la santé, l’amour et le travaille.

Pour cette nouvelle année, voila mes résolutions sur le plan professionnel.

  • Arrêter de tourner autour du pot avec les test unitaire et mettre vraiment le nez dedans.
  • Déployer mes projets d’une manière plus industrielle. fini les hg push ssh. Capistrano me voila.
  • Passer un peu moins de temps à zoner sur le net et plus à travailler.
  • Sortir un petit projet tout les 2 mois.
  • Reprendre le suivi et le maintient de mes différents sites.
  • Continuer de faire vivre ce blog avec des posts autour de php, ZF, Jmeter and co.
  • Passer la certification ZF

La liste évoluera peu-être au cours de la semaine qui vient, mais déjà si j’arrive à  la tenir, je serai content.

Zend_Log et Firebug

Aujourd’hui nous allons jouer un peu avec Zend_Framework, Firebug et les logs.

L’objectif : Tout les logs d’une application dans la console de Firebug et seulement les erreurs dans un fichier de log.

Pour rappel, Zend_Framework défini 8 niveaux de log accessible sous forme de constante via la classe Zend_Log.

const EMERG   = 0;  // Emergency: system is unusable
const ALERT   = 1;  // Alert: action must be taken immediately
const CRIT    = 2;  // Critical: critical conditions
const ERR     = 3;  // Error: error conditions
const WARN    = 4;  // Warning: warning conditions
const NOTICE  = 5;  // Notice: normal but significant condition
const INFO    = 6;  // Informational: informational messages
const DEBUG   = 7;  // Debug: debug messages

Lire la suite »

Jmeter, environnements et variables pré-définies

Depuis quelques temps j’utilise assez régulièrement jmeter, aussi bien pour faire des tests de charges que pour des tests fonctionnels.

Une problématique c’est rapidement posée : comment facilement tester sur les différents environnements – dev, preprod et prod dans mon cas –
En fonction de la plateforme, il y a plusieurs choses qui changent, l’url, les jeux de données – login password, album, questionnaire, … –

Lire la suite »

Clef de luhn ou formule de luhn

La clef de luhn – ou formule de luhn – c’est quoi ?

C’est une vérification de somme qui permet de contrôler la validité d’une chaine numérique. Sans le savoir, vous en croisez très régulièrement. Par exemple, les cartes bleues, les rib, la carte sncf, siret, siren…

Pour être plus clair, on additionne d’une certaine manière tout les chiffres et la somme doit être un multiple de 10. Si ce n’est pas le cas, on sait tout de suite qu’il y a une erreur.

Lire la suite »