TLDR: La cryptographie non sécurisée n'est même pas sûre si vous ne pouvez pas voir la valeur chiffrée.
Les autres articles sont assez bons pour expliquer de nombreuses raisons pour lesquelles vous ne devrait pas écrire votre propre crypto, dans un environnement où l'attaquant peut voir la valeur chiffrée, mais il manque quelque chose de vraiment important: vous ne devriez pas non plus écrire votre propre crypto lorsque l'attaquant ne peut pas voir le message chiffré.
Il y a cette chose appelée "canal secondaire". Les canaux secondaires sont (généralement 1 ) des choses involontaires qui fuient des informations sur ce que fait votre application. Par exemple, il faut peut-être plus de cycles CPU - et donc plus de temps - pour comparer un mot de passe partiellement correct à la valeur «chiffrée» 2 . Cela permettrait à un attaquant d'accélérer une attaque par force brute pour apprendre lentement le mot de passe correct.
Prenons un exemple naïf. Supposons qu'il faut 1 seconde pour tester un seul caractère du mot de passe soumis par rapport à la valeur stockée dans la base de données. Prétendez que le mot de passe correct comporte 8 caractères et qu'un mot de passe invalide est rejeté au premier résultat incorrect. L'algorithme pourrait ressembler à quelque chose comme:
boolean encrypt_password (string password) {if (not isascii (password)) {return false; } // ERREUR! résultat de la chaîne; foreach (car c: password) {result + = daves_magic_that_takes_1s (c)} return true;} boolean is_correct_password (input, pw_from_db) {if (input.length! = pw_from_db.length) {return false} foreach (char c_in, c_db: entrée, mot de passe) {c_in = daves_magic_that_takes_1s (c_in) if (c_in! = c_db) {return false}} return true; // mot de passe valide!}
Maintenant, imaginons que le mot de passe valide est "password" et que l'attaquant essaie l'entrée "a". Cela échoue, car les mots de passe sont de longueur incorrecte. L'attaquant peut essayer au hasard différents mots de passe. Chaque mot de passe incorrect plus long ou plus court que "mot de passe" prend moins d'une seconde à traiter. Disons qu'ils essaieront bientôt "12345678". «12345678» a la même longueur que «mot de passe», le traitement prend donc une seconde. Le timing est différent et l'attaquant le remarque. Ils essaient plusieurs fois de vérifier, et c'est cohérent.
L'attaquant essaie maintenant plusieurs mots de passe à 8 caractères. Ils prennent tous 1 seconde. L'attaquant a découvert un canal secondaire qui leur indique que le mot de passe valide comporte probablement 8 caractères. Maintenant, ils doivent déterminer quel mot de passe à 8 caractères est le bon.
L'attaquant commence à essayer au hasard des mots de passe à 8 caractères. Finalement, ils essaient "p2345678" et remarquent que cela prend 2 secondes. Ils testent un tas et découvrent que toutes les tentatives qui commencent par "p" prennent 2 secondes pour se terminer. L'attaquant devine que l'algorithme a un canal secondaire qui lui indique le nombre de caractères corrects.
Maintenant, au lieu d'avoir à essayer tous les mots de passe 96 ^ 8 pour forcer brutalement le mot de passe valide, l'attaquant n'a plus que pour essayer 96 * 8 mots de passe 3 . En fonction du nombre de mots de passe pouvant être testés en parallèle, ils peuvent probablement forcer brutalement le mot de passe dans un délai très raisonnable. C'est génial pour l'attaquant! Et c'est terrible pour la sécurité de votre système. 4
Comment nous protégeons-nous contre les canaux de synchronisation? Nous garantissons que toutes les opérations où le timing entraînerait une fuite d'informations sensibles DOIVENT toujours prendre le même temps à exécuter.
Cela peut ressembler à un exemple très simple. C'est arrivé dans la nature. La recherche dans NVD de «canal côté minutage» vous permettra d'obtenir de nombreuses vulnérabilités du monde réel qui produisent toutes le même type de résultats, permettant à un attaquant d'apprendre des informations secrètes auxquelles il n'est pas autorisé. Par définition, si toutes les opérations prennent le même temps quelle que soit l’entrée, alors le temps que prend quelque chose ne vous dit rien sur l’entrée.
Dans le monde réel, les canaux secondaires sont incroyablement facile à introduire. Dave n'en a probablement même pas entendu parler, et est probablement un bon ingénieur soucieux des performances de son système - qui est en fait un anti-pattern pour se protéger des canaux secondaires. L'algorithme de Dave peut très bien avoir des canaux secondaires à la fois évidents et subtils qu'il ne découvrira jamais, mais que les chercheurs et les attaquants savent rechercher et peuvent assez facilement écrire des tests automatisés pour les détecter. 5
Donc, ce n'est pas parce que vous ne pouvez pas voir la crypto que vous ne pouvez pas voir les effets secondaires d'une mauvaise cryptographie, et utilisez ces effets secondaires pour apprendre le secret protégé.
Endnotes
1: Eh bien, si vous êtes un agent de renseignement ou un bon journaliste, vous avez probablement mis en place canaux latéraux afin que vous puissiez communiquer avec vos agents / sources sans que «l'ennemi» le sache. De même, si vous êtes sournois, vous pouvez créer un protocole cryptographique avec un canal secondaire dans l'intention de divulguer des informations secrètes.
2: Puisque nous pouvons et devons toujours supposons que la cryptographie personnalisée n'est pas sécurisée (pour les raisons que d'autres ont mentionnées dans ce fil et plus), nous ne devrions probablement pas appeler l'utilisation d'algorithmes de cryptage personnalisés "cryptage" ou "décryptage" ... peut-être "cryptage non sécurisé" ou "décryptage cassé "...
3: J'ignore les attaques par force brute qui réussissent, en moyenne, lorsque l'attaquant a essayé 50% + 1 mots de passe, par souci de simplicité de description. Je me concentre sur les canaux secondaires, pas sur les attaques par force brute. Je passe également sous silence les mathématiques d'une attaque par force brute, car c'est aussi tangentiel au sujet principal; certains Google-Fu au nom du lecteur devraient localiser de nombreuses ressources qui approfondissent les détails.
4: "1 seconde est beaucoup trop lent", non? Aucun système du monde réel ne pourrait être vérifié pour les canaux latéraux de synchronisation du monde réel sur Internet, non? Faux. Je n'ai pas les références sous la main, mais il y a eu des recherches un certain nombre d'années pour montrer que vous pouvez tester statistiquement le timing de l'ordre de quelques millisecondes sur les transactions HTTP.
5 En fait, je serais prêt à parier qu'il existe des frameworks ou des outils existants (probablement les deux) que vous pouvez utiliser pour tester votre application pour des canaux secondaires évidents, si vous deviez utiliser votre Google-Fu. sup>