Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Tag: Théorie

Niveau :      
Résumé : RSA ; DSA

La suite ... la suite ... Aujourd'hui les signatures.

Non il ne s'agit pas du petit gribouillis que vous mettez en bas des chèques. Il s'agit de signature numérique. Et ce n'est pas non plus une image scannée de votre gribouillis. Même si le but de la signature numérique est la même, il s'agit de présenter une preuve (presque) infalsifiable du fait que vous avez bien lu, voire écrit un message.

En fait la signature ne fait que vous identifier, prouver que c'est bien vous qui étiez là. Le sens même de la signature dépend du document signé (chèque, article scientifique, patch ...)

Principe

Un document signé numériquement doit assurer deux choses :

  • Que le document transmis n'a pas été modifié depuis que vous l'avez lu
  • Que c'est bien vous qui avez lu / écrit / approuvé ce document, c'est-à-dire
    • que ce n'est pas quelqu'un d'autre
    • que vous l'avez bien fait

C'est la combinaison de deux choses qui va permettre cela :

  • Une fonction de hachage à sens unique
  • Un algorithme à clé publique

La première garantit que le document correspond à une empreinte et qu'on ne produire de document modifié ayant la même empreinte. Le deuxième garantit que la signature ne peut être générée à partir d'une empreinte différente, si ce n'est par le signataire.

Par conséquent, on prouve que c'est bien le propriétaire de la clé concernée qui a signé le document.

Attention, seule la combinaison document - empreinte - signature le prouve. Ce qui veut dire qu'il est toujours possible de supprimer un élément pour empêcher de prouver que vous l'avez signé (non monsieur le juge, il n'y a pas de preuve que j'ai signé ce chèque). Dans le même ordre d'idée, seule la signature de la clé prouve que celle-ci vous appartient et donc que c'est bien vous l'auteur de la signature. C'est donc au destinataire de conserver ces données s'il veut un jour pouvoir fournir la preuve que vous avez signé le document.

Authentification

La signature permet l'authentification. Supposons que vous vouliez vous authentifier sur un serveur. Il suffit que le serveur vous envoie un challenge (un message) que vous devrez signer. Il va alors vérifier la signature (et les certificats qui vont avec) et vous serez authentifié.

Algorithmes

Hachage

On utilise une fonction de hachage qu'on considère comme sûre (donc éviter md5). Voir l'article précédent.

RSA

Pour la partie signature à clé publique, on utilise souvent le RSA comme expliqué dans un article précédent.

DSA

Un autre algorithme est fréquemment utilisé pour les signatures, il s'agit du DSA (Digital Signature Algorithm). Cet algorithme à clé publique a été développé pour ne fonctionner que dans le mode signature.

Il n'est ni plus ni moins sécurisé que le RSA, il est juste différent. Il utilise des formules mathématiques similaires au RSA et n'est pas plus difficile à comprendre que celui-ci.

Niveau :      
Résumé : SHA1 ; MD5

Une fonction de hachage est une fonction surjective qui prends un certain nombre d'octets en entrée et qui rend un nombre fixe d'octets en sortie. Elles sont donc à sens uniques et plusieurs entrées peuvent donner le même résultat.

Ces fonctions peuvent servir à la détection d'erreurs involontaires ou à la détection de modifications volontaires. Dans le premier cas on cherche à avoir une fonction qui permettra de détecter des erreurs de transmission, de lecture ou de recopie (le dernier chiffre de votre numéro de sécurité sociale). Dans le deuxième cas, on cherche à empêcher une personne de lire ou de modifier elle-même le contenu des données et de les faire passer pour les données originales, c'est ce qu'on utilise pour signer un document ou stocker un mot de passe (vous saviez que vous aviez en réalité une infinité de mots de passe qui fonctionnent ?).

CRC

Dans la première catégorie, on trouve un grand nombre de codes de redondance cyclique. Ils consistent à calculer des polynômes sur les données en entrée. Il existe une méthode permettant de les calculer facilement et sous forme de flux, ce qui fait qu'ils sont très rapides et facile à implémenter dans le matériel.

Ils ne sont pas standardisés puisqu'ils dépendent de la définition du polynôme choisi ainsi que de la taille du résultat.

Par contre les CRC ne permettent pas de protéger les données contre des modifications volontaires puisqu'il est assez facile de calculer une série d'octets qui donnera un résultat donné.

MD5

MD5 a été inventé par Ronald Rivest, celui qui a fait entre autre rc4 et rc5. Cette fois l'algorithme a pour but d'empêcher de reconstruire une source de données différente produisant un résultat donné. Il est très répandu et sert probablement à stocker vos mots de passe. Malheureusement il est depuis quelque temps déjà considéré comme peu sûr, même s'il n'y avait pas eu d'attaque dessus. Il a d'ailleurs récemment fait la une puisqu'il a été possible de calculer des collisions avec un bête cluster de 200 PS3 pendant quelques jours, comme quoi c'est à le portée de tout le monde.

Il est donc fortement déconseillé de l'utiliser pour une application de sécurité durable.

SHA

SHA est une série de fonctions de hachage dont les algorithmes sont complètement différents les uns des autres. Elles peuvent être utilisées pour la sécurité tout comme MD5.

  • SHA-0 est dépassés depuis longtemps.
  • SHA-1 est la plus répandue après MD5, et conseillée si vous ne disposez pas de SHA-2. Bien qu'on ait des doutes sur sa sûreté, on n'a pas encore réussi à produire des collisions en un temps humainement mesurable.
  • SHA-2 est une fonction de hachage à taille variable. Si vous voyez des SHA-224, SHA-256, SHA-384 ou SHA-512, il s'agit toutes de SHA-2 avec la taille précisée en suffixe. C'est la méthode la plus sûre actuellement.
  • SHA-3 n'existe pas encore et fait l'objet d'un concours pour savoir quelle sera la solution d'avenir. (d'ailleurs monsieur sécurité Bruce Schneier en personne y participe)

Niveau :      
Résumé : DES ; AES

Après avoir vu le fonctionnement des algorithmes de chiffrement à clé publique, intéressons-nous à leur complémentaire, les algorithmes à clé privée.

Algorithme

La méthode de chiffrement par clé privée est des plus simple. Une valeur, commune à deux personnes communiquant ensemble, permet de chiffrer et déchiffrer des messages.

Exemple avec l'algorithme d'addition / soustraction :

  • Choix d'une clé privée entre les 2 participants : 4
  • Message à envoyer : 123
  • Chiffrement du message : 123 + 4 = 127
  • Envoi d'un message chiffré 127
  • Déchiffrement du message : 127 - 4 = 123

Simple comme bonjour à comprendre, il a fallu des siècles pour admettre qu'il était plus important de cacher la clé que de cacher la méthode de chiffrement. Ceci pour une raison simple, les algorithmes utilisés jusque là étaient trop simplistes et n'auraient pas résisté à la moindre analyse.

Il existe de très nombreux algorithmes, plus ou moins bons, plus ou moins historiques, plus ou moins standards. Limitons-nous à deux standards.

Algorithmes de chiffrement

DES

Le DES est un algorithme promu par la NSA (qui a pour objectif de vous espionner) dans les années 70. Il est relativement simple et avec un peu de patience vous le comprendrez sans problème. Il se base sur un ensemble de 16 cycles de permutations et décalages paramétrés par la clé. Je ne le décrirai pas car c'est un peu long et pas franchement utile.



Il est obsolète depuis longtemps mais ne lâche pas le morceau si facilement (die DES, die). Il se base sur une clé de 56bits et est sensible à la cryptanalyse différentielle (utilisation de plusieurs messages semblables pour trouver la clé plus facilement).

AES

L'AES est un algorithme récent promu par le NIST (qui a pour objectif de standardiser le monde industriel). Je n'ai pas lu en détail la spécification, mais il s'agit d'une combinaison de 4 opérations élémentaires : le remplacement d'octet, le décalage d'octet, l'échange d'octets et la combinaison avec la clé.

L'AES permet d'utiliser des clés de taille variable entre 128 et 256 bits.

Méthodes de chiffrement

Les algorithmes sont eux-même divisés deux grandes catégories selon ce qu'ils sont capables de chiffrer.

Chiffrement par bloc

Les algorithmes de chiffrement par bloc sont capables de chiffrer des blocs indépendamment les uns des autres. Ce qui est très pratique pour les disques durs par exemple.

Chiffrement par flot

Les algorithmes de chiffrement par flot sont capables de chiffrer des données au fil des données, l'élément de base étant généralement bien plus petit qu'un bloc. C'est bien utile pour vos conversations téléphoniques par exemple.

Il est en général possible de transformer un algorithme de chiffrement par bloc en algorithme de chiffrement par flot. Le contraire n'est pas toujours vrai.

Niveau :      
Résumé : RSA ; courbes elliptiques

Après vous avoir présenté les certificats, parlons de ce qui a permis la création de la notion de certificat : le chiffrement à clé publique.

Algorithme

Un algorithme de chiffrement à clé publique est un algorithme qui utilise une clé différente pour chiffrer et pour déchiffrer. Prenons un exemple simple et supposons que personne n'ait découvert la division. On choisit un algorithme à base de multiplication :

  • Créons une clé privée : 0.25
  • Et une clé publique : 4
  • Un message à chiffrer : 123
  • Chiffrons le message avec la clé publique : 123 * 4 = 492
  • On transmet le message 492
  • Déchiffrons le message avec la clé privée : 492 * 0.25 = 123

Et voila, on peut donner à tout le monde la clé publique. Personne ne sachant diviser par 4, il est impossible de retrouver la clé privée à partir de la clé publique, il est donc impossible lire un message qui a été chiffré spécialement pour vous avec votre clé publique. Par contre, en tant que possesseur de la clé privée, cachée au reste du monde, vous pourrez le lire.

Remarquez qu'on peut aussi utiliser la même technique dans l'autre sens pour faire de la signature :

  • Créons une clé privée : 0.25
  • Et une clé publique : 4
  • Un message à signer : 123
  • Signons le message avec la clé privée : 123 * 0.25 = 30.75
  • On transmet le message 123 avec sa signature 30.75
  • Vérifions la signature avec la clé publique : 30.75 * 4 = 123

Cet algorithme prouve cette fois que c'est bien la clé privée qui a été utilisée pour produire le message. En effet, personne ne sachant diviser 123 par 4, seul vous êtes capables de produire la signature à partir du message de départ. Mais attention, ça ne prouve pas que le message n'a pas été créé de toutes pièces. C'est pourquoi, en pratique, on utilise en plus une fonction à sens unique pour éviter qu'on puisse créer un message à partir de votre signature.

Bien sûr en pratique on utilise des fonctions un peu plus complexes et des nombres un peu plus grands.


continue reading...

Niveau :      
Résumé : certificat

Parlons un peu sécurité. Il a déjà été question de certificats iciet . Attachons-nous un peu plus à comprendre ce qu'est un certificat.

Un certificat est composé d'une partie publique et d'une partie privée. Je vous passe la théorie sur la cryptographie à clé publique, ce sera pour une autre fois. Intéressons-nous à la partie publique du certificat. Dans le cas d'un certificat x509 (initié par l'ITU, formaté par RSA et complété par l'IETF), on trouve un certain nombre d'informations. Ces informations permettent deux choses :

  • identifier le propriétaire
  • authentifier le propriétaire

Accessoirement on y retrouve aussi des signatures prouvant que l'identification a été faite par une personne digne de confiance.

Usage

On se sert de ces certificats pour initialiser des connexions sécurisées. Pour cela on commence par vérifier que le certificat appartient bien à la personne avec qui on veut communiquer grâce à une chaine de certification. Ensuite on vérifie qu'on a bien le propriétaire du certificat, et enfin on utilise un protocole adapté pour s'échanger une clé de session permettant de chiffrer les prochaines communications.

Détaillons tout ceci en partant de la fin.

Clé de session

Le chiffrement à clé publique a l'inconvénient d'être lent, on préfère donc utiliser un algorithme à clé privée, plus rapide, pour communiquer le plus gros des données. C'est pourquoi on s'échange une clé de session temporaire en utilisant un algorithme à clé publique, puis le reste de la communication se fait par clé privée.

Autre avantage, l'attaque est plus difficile puisque la clé servant à la communication peut changer régulièrement.

Mais avant de s'échanger une clé de session, il faut être sur de parler à la bonne personne.


continue reading...

Niveau :      
Résumé : la vie avec unix

Unix, ce n'est pas seulement un système, ce n'est pas seulement une marque, c'est aussi une façon de voir les choses, une façon de concevoir des programmes qui feront ce dont vous avez vraiment besoin. Nous allons parler des principes fondamentaux d'unix.

Tout est fichier

On commence à le savoir, les périphériques sont des fichiers qui se trouvent dans /dev, les processus sont des fichiers qui se trouvent dans /proc, les paramètres et données du noyau sont des fichiers qui se trouvent dans /sys et accessoirement /proc, les exécutables sont des fichiers normaux. Seule la carte réseau n'est pas un fichier, pour des raisons de performances paraît-il. Mais les connexions sont tout de même vues à travers des descripteurs de fichier dans les processus.

Les données sont du texte

Dans la philosophie unix, toutes les données doivent être stockées et transmises sous forme de texte. Cela peut coûter légèrement plus de place qu'un format binaire. Mais on y gagne beaucoup.

  • Un fichier texte peut être lu par les autres outils unix, et donc respecte de principe faire une chose et le faire bien
  • Un fichier texte peut être lu par un être humain et donc respecte le principe kiss
  • Un fichier texte permet une interopérabilité avec d'autres systèmes (pas de problèmes d'indiens en iso par exemple)
  • Un fichier texte facilite le débugage

On retrouve donc le texte partout :

  • Dans les scripts
  • Les fichiers de configuration
  • Des formats de données d'application
  • Dans les protocoles réseau de haut niveau
  • La sortie d'informations se vos programmes

On ne le retrouve pas dans les cas où l'espace ou le temps de parsing sont primordiaux, par exemple dans les formats d'image ou de son.

Et la tendance va en s'accentuant puisqu'on utilise de plus en plus un format texte structuré un peu partout et à toutes les sauces : le xml.

KISS

Keep it simple, stupid !


continue reading...

Niveau :      
Résumé : processus ; thread

Quelques personnes m'ont récemment demandé la différence entre un processus et un thread. Avant de bien en comprendre la différence, nous avons besoin de savoir deux choses : à quoi sert un noyau ? et comment fonctionne un processus ?

Base

Un noyau sert, entre autre, à gérer des tâches. Il permet à différents codes d'être exécutés chacun dans un monde séparé. Ces différents code ne peuvent pas empiéter sur ce que fait le voisin car le noyau les en empêche. C'est la protection, qu'on trouve implémentée au niveau même du processeur (celle qui défaillait dans windows 95).

Le noyau fournit aux processus un moyen de communiquer avec le monde extérieur ou entre eux (par des fichiers puisque tout est fichier). Ainsi chaque processus se voit comme ayant un accès complet au processeur et à une RAM de 4Go (pour un processeur 32 bits). Une partie de ces 4Go n'est en pratique pas modifiable car elle appartient au noyau (le dernier Giga). C'est le noyau qui se débrouille pour lui mettre à disposition ces 4Go, soit en lui associant de la vraie ram à la demande (en utilisant la notion de paging du processeur, à travers la fonction brk du noyau), soit en en mappant une partie sur le disque à la demande (fonction map), soit enfin en lui cachant qu'ils ne sont pas réellement disponibles (en stockant le contenu dans la swap).

Exemple de mapping mémoire : ram.png

Le noyau fait aussi en sorte que les processus ne consomment pas tout le processeur, il les répartit dans le temps pour leur en donner un morceau à chacun. C'est un service rendu par le scheduler du noyau.


continue reading...