Skip to main content

CSPRNG : les algorithmes aléatoires ont aussi besoin de sécurité !

Écrit par
feature snyk platform

9 février 2023

0 minutes de lecture

Si je lance une pièce en l’air, je connais les résultats possibles : pile ou face. En revanche, je ne peux pas prédire lequel va sortir. Je peux deviner avec 50 % de chances de réussite, mais je ne peux pas en être certain à 100 %. Si je lance un dé, mes chances diminuent (une sur six). Mais je connais toujours les résultats possibles.

Les ordinateurs excellent dans de nombreux domaines, notamment en matière de prévisibilité. Ils sont déterministes : il est impossible de créer un nombre véritablement aléatoire. On peut toutefois utiliser des fonctions pour obtenir une approximation du hasard. Ces fonctions sont appelées générateurs de nombres pseudo-aléatoires. 

Voyons un peu de code :

import random

# Generate a random integer between 0 and 10
random_number = random.randint(0, 10)

print(random_number)

Ce code génère un nombre aléatoire compris entre 0 et 10 (0 et 10 sont également des résultats possibles). C’est comparable au lancer de pièce ou de dé évoqué plus haut. Nous connaissons les résultats possibles, mais nous ne pouvons pas prédire avec précision lequel va sortir.

En cryptographie, nous voulons que la prévisibilité soit nulle. Autrement dit, nous ne voulons jamais pouvoir prédire le résultat. Imaginons, par exemple, que nous générions un jeton « aléatoire » pour réinitialiser un mot de passe. Nous pouvons utiliser l’heure actuelle pour générer une valeur de hachage. Affichée dans l’URL de réinitialisation du mot de passe, elle semble aléatoire. En réalité, elle est prévisible. Un pirate pourrait en tirer parti, surtout si le code est open source et consultable.

import hashlib
import time

t = time.localtime()
current_time = time.strftime("%H:%M:%S", t)

MD5_hash = hashlib.md5(current_time.encode())

print(MD5_hash.hexdigest())

La notion de hasard varie d’un domaine à l’autre. Dans certains cas, comme au casino, le résultat de la roulette est aléatoire, même si, statistiquement, il y a 2,6 % de chances que le résultat puisse être « prédit ». En cryptographie, ce n’est pas suffisant !

Le pseudo-aléatoire n’est pas sécurisé

Nous avons vu plus haut les générateurs de nombres pseudo-aléatoires (PRNG), mais il nous faut mieux. Pour qu’un nombre aléatoire soit sûr à des fins cryptographiques, il doit être imprévisible, ne pas se répéter et ne présenter aucun motif. Nous devons utiliser des générateurs de nombres pseudo-aléatoires cryptographiquement sûrs (CSPRNG).

Un CSPRNG est un type de générateur de nombres aléatoires spécialement conçu pour sécuriser les applications cryptographiques. Il génère une suite de nombres aléatoires difficile à prédire ou à reproduire, même si l’on connaît l’algorithme et la valeur de départ utilisée pour initialiser le générateur. Autrement dit, il doit être imprévisible. De plus, un CSPRNG doit pouvoir produire un grand nombre de valeurs aléatoires sans répétition ni motif discernable dans la séquence.

Les CSPRNG sont utilisés dans diverses applications cryptographiques, comme la génération de clés, le hachage de mots de passe et le chiffrement. Ils servent également dans des applications non cryptographiques, par exemple pour générer des identifiants uniques, des jetons et des clés de session.

CSPRNG et entropie

D’où vient le « CS » de CSPRNG ? Tout est une question d’entropie.

L’entropie mesure le caractère aléatoire ou le degré d’incertitude d’une source de données. Elle est essentielle à un CSPRNG. Les pools d’entropie sont des sources de données aléatoires qui servent à initialiser les CSPRNG, puis à les réinitialiser périodiquement afin que les nombres générés restent imprévisibles.

Les CSPRNG peuvent puiser dans différents types de pools d’entropie, et leur implémentation détermine ceux qu’ils utilisent. Il existe des générateurs matériels de nombres aléatoires (HRNG), des dispositifs physiques qui exploitent diverses sources de hasard, comme le bruit électronique, la désintégration radioactive ou le bruit atmosphérique, pour générer des nombres aléatoires. Ils sont considérés comme de bonnes sources d’entropie, car les processus physiques utilisés pour générer les nombres sont difficiles à prédire ou à reproduire.

Certains systèmes d’exploitation fournissent une source d’entropie qui peut servir à initialiser les CSPRNG. Par exemple, les fichiers /dev/random ou /dev/urandom sous Linux et les systèmes de type UNIX, ainsi que BCryptGenRandom() sous Windows. Si vous utilisez Python, vous pouvez appeler os.urandom() pour obtenir des octets aléatoires à partir de la source d’aléa propre à votre système d’exploitation.

Les CSPRNG peuvent aussi recueillir de l’entropie à partir de diverses sources environnementales, comme le trafic réseau, les mouvements de la souris ou les frappes au clavier. Ces sources sont imprévisibles et peuvent fournir une bonne entropie. Vous pouvez même aller plus loin, comme CloudFlare, et utiliser des lampes à lave !

Exemple de CSPRNG

Toujours avec Python, voici un exemple de génération d’un jeton compatible avec les URL :

import secrets

print (secrets.token_urlsafe(16))

Ce code génère un nombre pseudo-aléatoire cryptographiquement sûr. Nous pouvons l’utiliser de différentes façons, par exemple pour générer un jeton de réinitialisation de mot de passe. Ce jeton est ensuite intégré à l’URL et peut ressembler à ceci : https://supersecurereset.io/forgot-password?token=3PDhWtzkTo9QGAq6mvLxYA

En savoir plus sur le hasard et la sécurité

L’aléatoire non sécurisé et la récupération de mot de passe ne sont qu’un petit aspect de la sécurité informatique. La création d’un environnement et d’une application sécurisés demande beaucoup de travail. Nous ne nous attendons pas à ce que vous sachiez tout, c’est pourquoi nous proposons Snyk Learn.

Snyk Learn est un excellent outil d’apprentissage qui propose des contenus conçus par des experts en sécurité. Et le meilleur, c’est que c’est gratuit. Vraiment gratuit. Pas une démo, et surtout aucune limite au nombre de leçons que vous pouvez suivre. 

Pour en savoir plus sur le hasard et les méthodes de récupération de mot de passe, consultez ces deux leçons :

Améliorez vos compétences en programmation sécurisée

Des formations gratuites et de qualité en sécurité pour les développeurs, quand et où vous le souhaitez.

Lire la suite

Blog

Les modèles de pointe ont trouvé les vulnérabilités. Seul l’attaquant a trouvé les chaînes d’exploitation.

L’analyse statique a détecté les failles, mais seuls des tests d’attaque en conditions réelles ont prouvé comment elles pouvaient être enchaînées pour provoquer des compromissions. Comparaison d’Evo COS, de Claude Security et de Claude Code Security.

feature insights context
Blog

Les attaques autonomes sont déjà là. La défense doit suivre leur rythme.

Les attaquants autonomes réduisent la fenêtre de défense. Découvrez comment la découverte, la correction, la validation et la prévention continues peuvent aider les équipes de sécurité à suivre le rythme.

Blog

Pourquoi les agents de codage IA créent-ils sans cesse des failles de contrôle d’accès ?

Les agents de codage IA peuvent générer une logique d’autorisation qui compile et passe la revue, tout en exposant les données d’un tenant à un autre. Découvrez pourquoi les failles de contrôle d’accès sont difficiles à détecter et comment les prévenir.