
En cryptographie , une fonction de dérivation de clé ( KDF ) est un algorithme cryptographique qui dérive une ou plusieurs clés secrètes à partir d'une valeur secrète telle qu'une clé principale, un mot de passe ou une phrase de passe à l'aide d'une fonction pseudo-aléatoire (qui utilise généralement une fonction de hachage cryptographique ou un chiffrement par bloc ). Les KDF peuvent être utilisées pour étirer des clés en clés plus longues ou pour obtenir des clés d'un format requis, comme la conversion d'un élément de groupe qui est le résultat d'un échange de clés Diffie-Hellman en une clé symétrique à utiliser avec AES . Les fonctions de hachage cryptographique à clé sont des exemples populaires de fonctions pseudo-aléatoires utilisées pour la dérivation de clés.
Histoire
La première fonction de dérivation de clé basée sur un mot s'appelait « crypt » (ou « crypt(3) » d'après sa page de manuel ) et fut inventée par Robert Morris en 1978. Elle cryptait une constante (zéro), en utilisant les 8 premiers caractères du mot de passe de l'utilisateur comme clé, en effectuant 25 itérations d'un algorithme de chiffrement DES modifié (dans lequel un nombre de 12 bits lu à partir de l'horloge de l'ordinateur en temps réel est utilisé pour perturber les calculs). Le nombre de 64 bits résultant est codé sous forme de 11 caractères imprimables, puis stocké dans le fichier de mots de passe Unix . Bien qu'il s'agisse d'une grande avancée à l'époque, l'augmentation des vitesses de processeur depuis l' ère PDP-11 a rendu possibles les attaques par force brute contre crypt, et les progrès en matière de stockage ont rendu le sel de 12 bits inadéquat. La conception de la fonction crypt limite également le mot de passe de l'utilisateur à 8 caractères, ce qui limite l'espace de clés et rend impossibles les phrases de passe fortes .
Bien que le débit élevé soit une propriété souhaitable dans les fonctions de hachage à usage général, l'inverse est vrai dans les applications de sécurité des mots de passe dans lesquelles la défense contre le craquage par force brute est une préoccupation majeure. L'utilisation croissante de matériel massivement parallèle tel que les GPU, les FPGA et même les ASIC pour le craquage par force brute a rendu la sélection d'un algorithme approprié encore plus critique, car le bon algorithme doit non seulement imposer un certain coût de calcul non seulement sur les CPU, mais aussi résister aux avantages coût/performance des plates-formes massivement parallèles modernes pour de telles tâches. Divers algorithmes ont été conçus spécifiquement à cette fin, notamment bcrypt , scrypt et, plus récemment, Lyra2 et Argon2 (ce dernier étant le gagnant du concours de hachage de mots de passe ). La violation de données à grande échelle d'Ashley Madison au cours de laquelle environ 36 millions de hachages de mots de passe ont été volés par des attaquants a illustré l'importance du choix d'algorithmes pour sécuriser les mots de passe. Bien que bcrypt ait été utilisé pour protéger les hachages (ce qui rendait le craquage par force brute à grande échelle coûteux et chronophage), une partie importante des comptes dans les données compromises contenait également un hachage de mot de passe basé sur l'algorithme rapide à usage général MD5 , ce qui a permis de déchiffrer plus de 11 millions de mots de passe en quelques semaines.
En juin 2017, le National Institute of Standards and Technology (NIST) des États-Unis a publié une nouvelle révision de ses directives d'authentification numérique, NIST SP 800-63B-3, stipulant que : « Les vérificateurs DOIVENT stocker les secrets mémorisés [c'est-à-dire les mots de passe] sous une forme résistante aux attaques hors ligne. Les secrets mémorisés DOIVENT être salés et hachés à l'aide d'une fonction de dérivation de clé unidirectionnelle appropriée. Les fonctions de dérivation de clé prennent un mot de passe, un sel et un facteur de coût comme entrées, puis génèrent un hachage de mot de passe. Leur objectif est de rendre chaque essai de devinette de mot de passe par un attaquant qui a obtenu un fichier de hachage de mot de passe coûteux et donc le coût d'une attaque de devinette élevé ou prohibitif. »
Les fonctions modernes de dérivation de clés basées sur des mots de passe, telles que PBKDF2 , sont basées sur un hachage cryptographique reconnu, tel que SHA-2 , utilisent plus de sel (au moins 64 bits et choisis au hasard) et un nombre d'itérations élevé. Le NIST recommande un nombre d'itérations minimum de 10 000. « Pour des clés particulièrement critiques, ou pour des systèmes très puissants ou des systèmes où les performances perçues par l'utilisateur ne sont pas critiques, un nombre d'itérations de 10 000 000 peut être approprié. »
Dérivation de clé
L'utilisation originale d'un KDF est la dérivation de clés, la génération de clés à partir de mots de passe ou phrases de passe secrets. Les variantes sur ce thème incluent :
- En conjonction avec des paramètres non secrets pour dériver une ou plusieurs clés à partir d'une valeur secrète commune (ce qui est parfois également appelé « diversification de clés »). Une telle utilisation peut empêcher un attaquant qui obtient une clé dérivée d'apprendre des informations utiles sur la valeur secrète d'entrée ou sur l'une des autres clés dérivées. Un KDF peut également être utilisé pour garantir que les clés dérivées ont d'autres propriétés souhaitables, comme éviter les « clés faibles » dans certains systèmes de chiffrement spécifiques.
- En tant que composants de protocoles d'accord de clés multipartites . Des exemples de telles fonctions de dérivation de clés incluent KDF1, défini dans la norme IEEE 1363-2000 , et des fonctions similaires dans la norme ANSI X9.42.
- Pour dériver des clés à partir de mots de passe ou de phrases de passe secrets (un KDF basé sur un mot de passe ).
- Pour dériver des clés de longueur différente de celles fournies. Les KDF conçus à cet effet incluent HKDF et SSKDF. Ceux-ci prennent une chaîne de bits « info » comme paramètre « info » facultatif supplémentaire, qui peut être crucial pour lier le matériel de clé dérivé aux informations spécifiques à l'application et au contexte.
- Étirements clés et renforcement clés.
Étirements clés et renforcement des clés
Les fonctions de dérivation de clés sont également utilisées dans les applications pour dériver des clés à partir de mots de passe ou de phrases de passe secrets, qui ne possèdent généralement pas les propriétés souhaitées pour être utilisés directement comme clés cryptographiques. Dans de telles applications, il est généralement recommandé de ralentir délibérément la fonction de dérivation de clés afin de contrecarrer une attaque par force brute ou une attaque par dictionnaire sur la valeur d'entrée du mot de passe ou de la phrase de passe.
Cette utilisation peut être exprimée comme DK = KDF(key, salt, iterations) , où DK est la clé dérivée, KDF est la fonction de dérivation de clé , key est la clé ou le mot de passe d'origine, salt est un nombre aléatoire qui agit comme sel cryptographique , et iterations fait référence au nombre d' itérations d'une sous-fonction. La clé dérivée est utilisée à la place de la clé ou du mot de passe d'origine comme clé du système. Les valeurs du salt et le nombre d'itérations (s'il n'est pas fixe) sont stockés avec le mot de passe haché ou envoyés en texte clair (non chiffré) avec un message chiffré.
La difficulté d'une attaque par force brute augmente avec le nombre d'itérations. Une limite pratique au nombre d'itérations est la réticence des utilisateurs à tolérer un retard perceptible dans la connexion à un ordinateur ou dans la visualisation d'un message déchiffré. L'utilisation de salt empêche les attaquants de précalculer un dictionnaire de clés dérivées.
Une approche alternative, appelée renforcement de clé , étend la clé avec un sel aléatoire, mais supprime ensuite le sel de manière sécurisée (contrairement à l'étirement de clé). Cela oblige à la fois l'attaquant et les utilisateurs légitimes à effectuer une recherche par force brute de la valeur du sel. Bien que l'article qui a introduit l'étirement de clé ait fait référence à cette technique antérieure et ait intentionnellement choisi un nom différent, le terme « renforcement de clé » est désormais souvent (sans doute incorrectement) utilisé pour désigner l'étirement de clé.
Hachage de mot de passe
Malgré leur utilisation originelle pour la dérivation de clés, les KDF sont probablement plus connues pour leur utilisation dans le hachage de mots de passe ( vérification de mot de passe par comparaison de hachage ), comme l'utilisent le fichier passwd ou le fichier de mots de passe fantômes . Les fonctions de hachage de mots de passe devraient être relativement coûteuses à calculer en cas d'attaques par force brute, et l' étirement de clé des KDF se trouve fournir cette caractéristique. Les paramètres non secrets sont appelés « salt » dans ce contexte.
En 2013, un concours de hachage de mots de passe a été lancé pour choisir un nouvel algorithme standard de hachage de mots de passe. Le 20 juillet 2015, le concours s'est terminé et Argon2 a été annoncé comme le grand gagnant. Quatre autres algorithmes ont reçu une reconnaissance spéciale : Catena, Lyra2 , Makwa et yescrypt .
En mai 2023, l' Open Worldwide Application Security Project (OWASP) recommande les KDF suivants pour le hachage de mot de passe, classés par ordre de priorité :