Question:
Le "protocole de Dave" n'est-il pas bon si seule la base de données, et non le code, fait l'objet d'une fuite?
Rick
2019-07-01 13:49:09 UTC
view on stackexchange narkive permalink

J'ai lu "La sécurité du mot de passe de mon développeur est-elle bonne ou mauvaise, et pourquoi?", mais il reste une question dans mon esprit:

Même si quelqu'un utilise un mauvais algorithme de sécurité maison, tout comme Dave, un attaquant ne peut pas obtenir le vrai mot de passe si l'attaquant ne compromet que la base de données, pas le serveur. La réponse de Mark Burnett à la question de Dave semble prouver ma supposition.

Encore une fois, prenons le code de Dave comme exemple. Dave utilise des fonctions de hachage non sécurisées / rapides, md5 et sha1, donc oui, vous pouvez facilement déchiffrer son mot de passe (obtenir le texte brut) de la base de données. Mais vous ne pouvez toujours pas obtenir le vrai mot de passe si son serveur n'est pas compromis.

@Anders En fait, je me sens assez confus en lisant certaines questions de sécurité de mot de passe hautement votées.Parce que quand on parle de «compromis» ou «fissuré», je ne sais pas s'ils parlent à la fois du serveur et de la base de données sont compromis, ou simplement de la base de données.
"Oui, vous pouvez facilement déchiffrer son mot de passe (obtenir le texte brut) de la base de données. Mais vous ne pouvez toujours pas obtenir le vrai mot de passe si son serveur n'est pas compromis" .Je ne comprends pas cette ligne.Si vous pouvez déchiffrer son mot de passe, comment fairevous n'obtenez pas le vrai mot de passe?
@VipulNair Parce que, comme le fait Dave, il ne stocke pas directement le hachage du mot de passe, vous ne savez pas quelle conversion il utilise sur le serveur.
Huit réponses:
Conor Mancone
2019-07-01 14:51:46 UTC
view on stackexchange narkive permalink

Oui, mais ..

Pour que les choses soient claires et claires ... Nous parlons d'un compromis de base de données uniquement lorsqu'un attaquant a accès à la base de données mais pas au code source de l'application. Dans ce cas, l'attaquant obtiendra les hachages de mot de passe mais ne pourra pas les déchiffrer et obtenir les mots de passe d'origine à cause de l'algorithme personnalisé de Dave. Donc, dans le cas d'une violation de base de données uniquement, oui, l'algorithme de mot de passe de Dave protégera davantage les mots de passe que s'il avait utilisé MD5 ou SHA1.

Cependant Ce n'est qu'une voie possible pour fuites du système. Il y a un fait clé qui détruit les "mathématiques" qui font que l'algorithme homebrew de Dave semble raisonnable.

La moitié de toutes les violations commencent en interne.

(sources 1 2 3) Ce qui est très décevant, une fois que vous l'avez laissé pénétrer. Sur la moitié des violations causées par des employés, la moitié sont accidentelles et la moitié sont intentionnelles . L'algorithme de Dave peut être utile si vous ne vous inquiétez que d'une fuite de base de données. Si c'est tout ce qui vous inquiète, alors le modèle de menace contre lequel vous vous protégez est erroné.

Pour ne choisir qu'un seul exemple, les développeurs ont par définition accès au code source de l'application. Par conséquent, si un développeur obtient un accès en lecture seule à la base de données de production, il dispose désormais de tout ce dont il a besoin pour déchiffrer facilement les mots de passe. L'algorithme personnalisé de Dave est désormais inutile, car il repose sur des hachages anciens et faciles à déchiffrer.

Cependant, si Dave avait utilisé un algorithme de hachage de mot de passe moderne et utilisé à la fois un sel et du poivre, le développeur qui a gagné l'accès à un vidage de base de données uniquement n'aurait absolument rien d'utile.

Ce n'est qu'un exemple aléatoire, mais le point global est simple: il y a beaucoup de fuites de données qui se produisent dans le monde réel où un hachage approprié aurait arrêté les dégâts réels alors que l'algorithme de Dave ne pouvait pas.

En résumé

Tout est question de défense en profondeur. Il est facile de créer une mesure de sécurité qui peut protéger contre un type particulier d'attaque (l'algorithme de Dave est une légère amélioration par rapport à MD5 pour la protection contre les fuites de bases de données uniquement). Cependant, cela ne sécurise pas un système. De nombreuses brèches du monde réel sont assez compliquées, tirant parti des faiblesses à plusieurs points d'un système pour finalement faire de réels dégâts. Toute mesure de sécurité qui commence par l'hypothèse "C'est le seul vecteur d'attaque dont je dois m'inquiéter" (ce que Dave a fait) va se tromper dangereusement.

Les commentaires ne sont pas destinés à une discussion approfondie;cette conversation a été [déplacée vers le chat] (https://chat.stackexchange.com/rooms/95782/discussion-on-answer-by-conor-mancone-isnt-daves-protocol-good-if-only-the-ré).
Fund Monica's Lawsuit
2019-07-01 22:48:20 UTC
view on stackexchange narkive permalink

Cela ne répond pas spécifiquement à la question sur le protocole de Dave, mais je voulais aborder la question plus générale, pour les Daves du monde entier qui écrivent leurs propres hachages. Il y a quelques choses, Daves, que vous devez réaliser:

  1. Vous n'êtes pas un cryptographe . Ce n'est pas un reproche contre vous; Je n'en suis pas un non plus. Mais même si vous étiez un cryptographe, il vous faudrait être le meilleur au monde pour être certain que votre algorithme ne présente aucun défaut susceptible de compromettre la sécurité, car même les experts mess up a lot (les quatre mots sont des liens séparés). Entre autres choses, les failles potentielles dans les hachages incluent:
    • Réversibilité accidentelle. Peut-être que vous ne le pensiez pas, mais vous mettez trop d'informations dans le "hachage", et maintenant cela peut être inversé de manière triviale, même sans force brute. Pour un exemple d'algorithme "complexe" qui est néanmoins assez facile à inverser, regardez les générateurs congruentiels linéaires.
    • Pas assez de complexité sur les CPU, GPU, ASIC, etc. C'est étonnamment difficile à faire; il y a une raison pour laquelle il n'y a que trois bibliothèques pour faire le hachage de mot de passe, et elles sont toutes basées sur les mêmes idées. À moins que vous ne soyez intimement familiarisé avec le fonctionnement des GPU et ASIC, vous allez probablement créer quelque chose qui peut être exécuté beaucoup plus rapidement sur les GPU que sur les CPU, annulant instantanément toutes les autres protections dont vous disposez.
    • Trop de complexité là où vous l'exécutez, combiné avec le dernier point. Il est très facile d'indiquer vos tests de performances et de dire: "Écoutez, il me faut 30 secondes pour faire 30 hachages, c'est super!" Sauf que vous n'êtes, encore une fois, pas un cryptographe ou un développeur de GPU, donc vous ne réalisez pas que vos ajouts et multiplications complexes peuvent en fait être répliqués assez facilement sur les GPU, de sorte qu'ils peuvent déchiffrer 30 millions de hachages en 30 secondes, tout en DoSing votre service en essayant de vous connecter plus d'une fois par seconde.
    • Uniformité insuffisante. La sortie d'une fonction de hachage de mot de passe théoriquement parfaite est impossible à distinguer de celle d'un véritable générateur de nombres aléatoires, lorsqu'elle est alimentée en entrée variable. En pratique, nous ne pouvons pas tout à fait y arriver, mais nous pouvons être incroyablement proches. Votre algorithme pourrait ne pas l'être. Et non, «regarder» au hasard ne signifie pas qu'il est en fait assez proche; si vous êtes assez inexpérimenté pour écrire votre propre crypto secret pour une "meilleure" sécurité, vous êtes assez inexpérimenté pour ne pas savoir comment détecter le vrai hasard.
    • Même si vous construisez votre algorithme entièrement hors , des primitives cryptographiques solides, vous pouvez toujours les mal assembler.
  2. Vous n'êtes pas un programmeur de cybersécurité . Il y a probablement un meilleur mot pour cela, mais le fait est que vous ne vous êtes pas spécialisé dans l'écriture de code qui implémente correctement des algorithmes, même ceux comme le vôtre. Pour une très liste brève des problèmes possibles qui pourraient être visibles uniquement à partir de la base de données, chacun étant lié au premier résultat Google pour "[item] attack":

Et tout cela est juste de penser exclusivement aux attaques hors ligne sur les bases de données, où la réflexion est menée par un étudiant qui ne se spécialise même pas en cybersécurité . Je vous garantis que j'ai manqué pas mal de choses. J'ai complètement ignoré tous les autres vecteurs d'attaque pour les MITM, les clients malveillants, etc. J'ai également omis de mentionner toutes les erreurs qui pourraient se produire même si vous utilisiez un produit standard; Considérez cela comme un exercice pour le lecteur de comprendre comment vous pourriez utiliser même une bonne crypto-monnaie. Enfin, j'ai complètement omis la classe commune d'erreurs où le développeur utilise le chiffrement là où il devrait utiliser des hachages , que je vois parfois.

Donc, en résumé, Dave, chaque fois que vous pensez avoir la meilleure idée pour un hachage interne secret à utiliser pour votre code de production et il n’est pas d’utiliser un standard, -le produit public, testé de manière approfondie, souvenez-vous de ceci:

Ce n'est pas le cas.

Utilisez simplement bcrypt. (Ou Argon2)

(En passant, si vous construisez simplement un algorithme pour le plaisir et / ou l'auto-apprentissage, n'hésitez pas à ignorer tout cela. votre propre algorithme pour protéger les mots de passe en production est dangereux car vous allez créer un algorithme faible qui offre peu ou pas de protection. Construisez votre propre algorithme pour voir si vous pouvez le casser est un excellent moyen de passer le temps, de stimuler votre esprit et peut-être même d'apprendre un peu de crypto.)

J'ai des horreurs spécialement conçues pour inquiéter un concepteur de carte ASIC, mais j'ai peur de les utiliser car l'allocation de 5600k de RAM par vérification de mot de passe ouvre un DOS facile contre mon serveur.
"Utilisez simplement Bcrypt" - non, utilisez Argon2.C'est l'étalon-or depuis un certain temps déjà.
@Polynomial Dans le message original, Dave essayait de remplacer Bcrypt, c'est pourquoi la version originale de ce message ne faisait référence qu'à Bcrypt.Bon point;J'ai ajouté Argon2.
Si vous indentez la ligne commençant par «Et tout cela ne fait que penser exclusivement aux attaques hors ligne sur les bases de données ...» avec 4 espaces, elle sera rendue dans le cadre de la section numérotée au-dessus, en l'alignant avec ce contenu.
@jpmc26 Ce serait le cas, mais j'essayais de l'appliquer aux deux sections.Tous les problèmes que j'ai mentionnés dans le premier bit pourraient laisser la base de données, seule, fissurable, directement ou autrement.Si je l'étendais à tout ce qui pourrait conduire à une attaque, cette liste serait beaucoup plus longue ...
@Polynomial L'article de wikipedia sur Argon2 est assez court et mis à part la référence au "Password Hashing Competition" qui semble ne pas avoir été fait par une grande organisation réputée.Ne pas dire que cela rend les choses mauvaises, mais y a-t-il une analyse détaillée par des experts connus que je pourrais examiner?(Même une question sur ce site même [ne le mentionne pas en évidence] (https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords).des algorithmes en constante évolution et décidez de ce qui a été suffisamment testé pour être utilisé.
@Voo Cette question date de 2010. En excluant la modification automatique de la communauté pour corriger les liens, la dernière modification date de 2015, et cela ne semble pas avoir été une modification de contenu, seulement une modification de grammaire.Si vous regardez l'historique des modifications, vous verrez que ces informations datent vraiment de 2013. Un _lot_ peut changer en six ans, en particulier dans les domaines numériques, en particulier dans la cybersécurité.J'ai choisi une question plus récente intentionnellement, car quelque chose de 2018 est moins obsolète que quelque chose de 2013, et _that_ question appelle explicitement Argon2 le choix préféré.
@Nic En quelque sorte manqué votre lien dans la réponse, je blâme mon téléphone.
@Voo Argon2 a été largement approuvé par les universitaires et la communauté de la sécurité.Bien que quelques attaques de réduction des coûts aient été découvertes dans l'un des modes, elles ne nuisent en rien à la supériorité globale d'Argon2 sur bcrypt.Je le recommande fortement pour les nouvelles conceptions (et les mises à niveau de conception), à moins que vous ne soyez dans une situation où une implémentation de scrypt est disponible nativement dans votre plate-forme / cadre de choix et Argon2 ne l'est pas.Je ne recommanderais généralement pas bcrypt pour les nouvelles conceptions, sauf pour les appareils IoT avec très peu de mémoire.
@Voo Dites simplement qu'il a été compromis car il utilise l'algorithme de Dave pour stocker votre mot de passe :)
@Polynomial Je suis assez sûr que si vous essayez de sécuriser un appareil IoT avec très peu de mémoire, vous n'utiliserez pas du tout une base de données de hachage de mot de passe.Vous allez créer la fonctionnalité de mot de passe dans l'application de contrôle, en utilisant une fonction de dérivation de clé, puis une cryptographie standard basée sur une clé.Ou du moins, c'est comme ça que je le ferais ...
@NicHartley Tous les appareils n'interagissent pas avec les systèmes externes.Il existe encore des cas courants dans le micrologiciel où vous devez effectuer une dérivation de clé à partir d'un mot de passe ou stocker un mot de passe localement de manière sécurisée.
@Polynomial ... Je ne suis pas sûr de comprendre ce que vous voulez dire.Pouvez-vous donner des exemples d'appareils IoT qui n'interagissent jamais, même indirectement, avec d'autres appareils à très faible consommation?Je demande parce que même l'automatisation industrielle a généralement une sorte d'ordinateur central «standard», qui pourrait facilement faire l'étirement des touches d'une manière beaucoup plus résistante à la force brute que n'importe quel appareil embarqué.
@NicHartley Ils ne sont pas nécessairement IoT, ils peuvent simplement être du matériel ordinaire.Les appareils autonomes comme les gestionnaires de mots de passe matériels viennent à l'esprit.J'ai également vu des appareils IoT où un mot de passe d'accès à distance est stocké localement sous forme de hachage et les demandes entrantes prennent ce mot de passe et le vérifient pour sa validité - PBKDF2 convient ici, Argon2 ou scrypt n'est pas faisable.
@Polynomial Ohh, je vois ce que tu veux dire - d'accord, c'est un bon point.Bien que dans ce cas, j'espère que celui qui le fabrique se rendra compte que quelle que soit la fonction qu'il utilise, un PC peut immédiatement le casser plusieurs fois plus rapidement, simplement parce qu'il n'est pas un appareil à faible consommation d'énergie ... Quant aux appareils IoT "appropriés"qui prennent un mot de passe, je suis sûr que c'est fait, mon point est seulement que cela ne devrait pas être.Je vous donne plus de crédit que la plupart des développeurs IoT.Même dans les appareils non intégrés à l'IoT, un effort doit être fait pour éviter d'utiliser des mots de passe.
Anders
2019-07-01 15:16:29 UTC
view on stackexchange narkive permalink

En cas de violation de la base de données et non du code source, Dave pourrait avoir amélioré les choses par rapport à SHA1 simple . Mais ...

  1. Le code source est également susceptible d'être divulgué, comme l'explique Conor Mancone.

  2. L'homebrew pourrait bousiller le hachage, le rendant encore moins sûr qu'un simple SHA1. Dieu sait comment l'étrange engin de Daves interagit avec les composants internes de l'algorithme de hachage. Si rien d'autre, Dave a créé un petit enfer de maintenance pour ceux qui viennent après lui, et les gros dégâts ne sont jamais bons pour la sécurité.

  3. Cela donne un faux sentiment de sécurité. Si Dave n'avait pas été aussi fier de sa brillante solution, il aurait peut-être pris le temps de se renseigner sur la façon de faire correctement le hachage de mot de passe. D'après la question, il est clair que Dave pense que ce qu'il a fait est mieux que de dire bcrypt. Ce n'est pas le cas.

  4. La petite protection supplémentaire offerte par l'algorithme homebrew aurait pu être obtenue avec un pepper à la place. C'est mieux qu'un algorithme homebrew de toutes les manières possibles.

Donc oui, un homebrew pourrait être meilleur que SHA1 dans certaines circonstances très spécifiques. Si c'est mieux en moyenne, c'est une question ouverte, mais la réponse n'a pas vraiment d'importance. Le fait est que c'est terrible comparé à un véritable algorithme de hachage de mot de passe, et c'est exactement ce que le brassage à domicile a empêché de mettre en œuvre Dave.

En bref, Dave a foiré ça.

Je dirais que si ajouter un poivre signifie ajouter le poivre directement au mot de passe, puis le hacher.C'est inutile et le mauvais algo de Dave l'emporte dans cette situation.
@Rick Pourquoi serait-ce inutile?
De plus, je ne comprends pas pourquoi certaines réponses hautement votées disent que l'ajout d'un poivre directement au mot de passe et au hachage peut être plus sécurisé.Vous pouvez simplement augmenter la longueur du sel en concaténant simplement le poivre et le mot de passe, que ce soit en l'ajoutant ou en le préfixant.Je pense qu'un poivre devrait être utilisé comme clé secrète, par exemple, avec `HMAC`.Mais comme je le commente sous la réponse d'@Conor Mancone, il suffit de modifier un peu.
@Rick Oui, un poivre doit être secret et non stocké dans la base de données.Donc, il protège contre exactement la situation que vous décrivez - une base de données fuitée, du code non divulgué.C'est à cela que sert un poivre, vous ne pouvez donc pas le comparer à l'augmentation de la longueur du sel.
@Rick Je ne prends aucune position sur la façon de mélanger le poivre - cela sort du cadre de cette question.
@Rick La question demeure: pourquoi un piment serait-il inutile?
Laissez-nous [continuer cette discussion dans le chat] (https://chat.stackexchange.com/rooms/95578/discussion-between-rick-and-anders).
atk
2019-07-02 12:14:09 UTC
view on stackexchange narkive permalink

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>

Artelius
2019-07-02 05:31:24 UTC
view on stackexchange narkive permalink

Attaques en clair connu / en texte clair choisi

Supposons que vous connaissiez le mot de passe d'un utilisateur particulier, ou mieux encore, que vous puissiez vous inscrire et créer votre propre mot de passe autant de fois que vous le souhaitez.

Et vous avez un accès en lecture à la base de données.

Supposons en outre que vous soupçonnez (ou savez ) qu'il s'agit d'un algorithme homebrew assez simple.

À ce stade, vous pouvez commencer à forcer brutalement l'algorithme et essayer d'obtenir le hachage dans la base de données. Par exemple, vous pourriez "deviner" l'algorithme est

  $ hash = md5 ($ pass. $ Salt. 'Some random string');  

Vous forceriez brutalement la chaîne aléatoire. Cela devient plus difficile à mesure que la chaîne s'allonge, mais vous pourrez peut-être exploiter certaines faiblesses de md5 en choisissant soigneusement les mots de passe. $ hash = sha1 (md5 ($ pass. $ salt. 'abc'). 'def');

puis réessayez le forçage brutal.

Quelque chose comme compliqué car l'algorithme de Dave serait extrêmement difficile sans quelques indices. Si vous saviez qu'une réorganisation des personnages était impliquée, cela aiderait.

* Ceci. * L'attaquant peut déterminer l'algorithme sans trop d'effort!C'est ce qui nécessite le principe de Kerckhoffs.La seule chose avec laquelle je ne suis pas d'accord, c'est que c'est difficile à comprendre.Je suppose que c'est facile à comprendre pour un attaquant, même si cela peut nécessiter un peu plus d'efforts qu'un MD5 ordinaire.
@jpmc26 Avoir la base de données permet de _vérifier_ facilement un algorithme potentiel mais reste difficile à _ deviner_.Vous pouvez choisir le fruit à portée de main (comme le programmeur stockant un sel dans la base de données mais oubliant de l'utiliser!), Mais au-delà, il y a tout simplement trop de permutations à explorer.Dans une ligne de code, vous pouvez multiplier toutes les valeurs ASCII par 3, les concaténer, les interpréter en hexadécimal, puis soustraire 730 avant le hachage ... comment pouvez-vous même écrire un brute-forcer pour explorer cette merde?
La seule exception étant que si vous observez que la distribution des valeurs finales est non uniforme et / ou dépendante de l'entrée d'une certaine manière, cela peut entraîner une fuite d'informations sur l'algorithme.Mais si la dernière étape de l'algorithme est une fonction de hachage standard (même md5), cela ne se produira pas.
"Comment écrivez-vous même un brutal pour explorer cette merde?"L'une des choses que j'ai apprises, c'est que les attaquants sont bien plus intelligents que je ne peux l'imaginer.=) Nous ne pouvons pas prouver que quelqu'un n'a pas trouvé une façon complètement inattendue de le faire, et le fait que tant de schémas cryptographiques soient tombés dans une attaque très intelligente que personne n'imaginait possible est pourquoi nous ne dépendons pas desecret.Je ne veux tout simplement pas croire que personne ne l'a fait.
@jpmc26 Bien sûr._Everything_ doit être supposé sensible aux attaques créatives;mais nous faisons des affirmations sur les choses afin que d'autres agents de sécurité puissent identifier les faiblesses.Je serais très intéressé d'entendre parler des faiblesses connues dans ce genre de choses.Gardez à l'esprit que l'utilisation de poivrons est courante comme mesure supplémentaire et qu'ils reposent sur le secret.Ce que nous avons ici est (si c'est bien fait) une forme différente de poivre, comme je le vois.
Rick
2019-07-02 20:23:54 UTC
view on stackexchange narkive permalink

J'ai appris beaucoup plus que cette question, en lisant la réponse de @Conor Mancone et en discuté avec @Conor Mancone et @Anders, alors je décide de l'écrire. Corrigez-moi si je me trompe à nouveau.


md5 et sha1 sont cassés, mais pas comme je pense que c'est

Je pensais à tort que la sortie de hachage de md5 et sha1 peut toujours être facilement fissurée (obtenir le texte d'entrée d'origine), quelle que soit la taille de l'entrée .

Non, ce n'est pas .

Si j'utilise un poivre assez long sur le serveur, même si j'utilise md5 ou sha1 pour hacher un mot de passe, il serait toujours sécurisé, étant donné que le serveur n'est pas compromis .

Par exemple: stockez md5 ($ 128bits_long_pepper. $ password) dans la base de données.
Même sans sel, vous ne pouvez pas le casser. Disons que votre vitesse de hachage md5 est de 100 milliards de hachages / s . Prenons cela comme 2 ^ 40 hash / s pour plus de commodité, puisque 2 ^ 40 > 100 milliards . Pour le forcer brutalement, il faut encore 2 ^ 128/2 ^ 40 = 2 ^ 88 secondes = 9,80719764 × 1018 ans . Et bien sûr, je pense que personne ne pré-calculerait une telle table arc-en-ciel.

Mais je ne dis pas que je choisirais md5 pour hacher mon mot de passe. Je ne le ferais pas. Parce qu'une fois que votre serveur est également compromis, ces mots de passe hachés ne diffèrent pas du texte clair.

Je suis un débutant et j'ai lu de nombreux articles très votés parlant de la gravité de md5 et sha1 , mais je ne vois aucune réponse à ce sujet ⬆️ . Je n'en remarque que dans les commentaires.


Fonction sel, poivre, hachage

Enfin, je pense que je comprends parfaitement ces 3 concepts et leurs cas d’utilisation / combinaisons.
Premièrement, je résume 3 types de attaques par moi-même: 1. attaque par force brute (la méthode «tout essayer») 2. attaque de table arc-en-ciel (la recherche inversée directe) 3. attaque par dictionnaire ( $ pepper. $ Common_password. $ Salt force brute, force partiellement brute, par rapport à 1.)

Donc je pense:

  1. Salt vise à défendre l'attaque de table arc-en-ciel.
  2. Une bonne fonction de hachage (lente) vise à défendre l'attaque par force brute.
  3. Pepper vise principalement à défendre les attaques par dictionnaire, étant donné que le serveur n'est pas compromis.

Expliquez avec un exemple:

( Salt ) Il faut se rendre compte qu'un sel n'est pas une très grosse affaire comme beaucoup de gens le décrivent. Il ne défend qu'une chose, à savoir qu'un attaquant ne peut pas simplement effectuer une recherche inversée dans sa table arc-en-ciel pour obtenir votre mot de passe non haché. Si l'on utilise uniquement salt + fonction de hachage rapide (pas de poivre sur le serveur), alors un attaquant peut faire de la force brute pour chaque mot de passe haché. Bien sûr, une autre condition préalable est que vous n'avez pas besoin que votre utilisateur stocke un mot de passe long 128 bits pour l'enregistrement :).

Donc:

  • salt + fonction de hachage rapide ne défend pas l'attaque par force brute. Qu'il puisse défendre une attaque de table arc-en-ciel ou une attaque de dictionnaire n'est pas important maintenant.
  • salt + fonction de hachage lent défend les attaques par force brute. Il défend également l'attaque de la table arc-en-ciel. Il ne défend pas les attaques par dictionnaire.

( Pepper ) Mais pour la combinaison salt + fast hash , si vous utilisez un pepper assez longtemps sur le serveur, étant donné que votre serveur n'est pas compromis, seule la base de données le fait, le mot de passe sera toujours sécurisé.

Donc:

  • sel + fonction de hachage rapide + poivre long (par exemple 128bits) + serveur non compromis peut maintenant défendre une attaque par force brute. Il défend également l'attaque de table arc-en-ciel et l'attaque par dictionnaire.

( fonction de hachage ) Mais une fois que le serveur est compromis, la combinaison ci-dessus est comme une merde. L'attaquant connaîtrait le poivre. La difficulté de cracker sel + fonction de hachage rapide + poivre long (par exemple 128bits) + serveur est compromis est la même que quelqu'un utilise uniquement une fonction de hachage rapide .

Donc:

  • sel + fonction de hachage rapide + poivre long (par exemple, 128 bits) + le serveur est compromis ne défend pas l'attaque par force brute. Qu'il puisse défendre une attaque de table arc-en-ciel ou une attaque de dictionnaire n'est pas important maintenant.
  • Mais si vous utilisez une fonction de hachage sécurisée / lente, les choses changent.
    sel + fonction de hachage lent + poivre (pas nécessaire pour être très long par exemple 6 caractères peut-être assez bien?) + le serveur est compromis défendre l'attaque par force brute. Il défend également l'attaque de la table arc-en-ciel. Il ne défend pas l'attaque par dictionnaire.

Et la salt + slow hash function , n'est-ce pas suffisant? Cette combinaison défend l'attaque par force brute et l'attaque de table arc-en-ciel. Mais il ne défend pas l'attaque par dictionnaire. Ajouter un poivre sur le serveur est facile, pourquoi pas?


Dites quelque chose pour Dave

Comme vous pouvez le voir ci-dessus, un poivre est juste quelque chose pour lequel vous l'utilisez faire quelques conversions côté serveur.
C'est la "conversion sur le serveur" qui compte vraiment, tant que le serveur n'est pas compromis.
Par exemple, vous prenez une constante aléatoire et la concaténez avec le mot de passe, hash ($ pepper. $ password, $ salt) , c'est un type de conversion. Donc, si vous inventez des algorithmes merdiques sur le serveur comme le fait Dave, vous faites également une conversion. Dans les deux cas, l'attaquant doit compromettre le serveur. Pour le premier, l'attaquant peut simplement saisir votre valeur constante. Pour ce dernier, l'attaquant doit comprendre comment fonctionne votre truc de merde et doit faire un inverse.

Donc mon point est, je pense que l'idée de Dave est tout à fait bonne (faire une conversion sur le serveur), mais il n'est tout simplement pas nécessaire d'ajouter une telle obscurité / complexité. Parce que la maintenance pourrait être comme un enfer si elle ajoute de plus en plus de complexité de cette manière. Une "conversion" comme la concaténation d'un piment sur le serveur est assez loin. Encore une fois, je pense que c'est après tout un problème de compromis. Et l'idée de Dave est juste depuis le début (il veut utiliser une sécurité supplémentaire côté serveur).

"Pour ce dernier, l'attaquant doit comprendre comment votre truc de merde fonctionne et doit faire un revers."- Pour la plupart des fonctions cryptographiques homebrewed, les attaquants n'ont pas besoin d'accéder à votre code source pour comprendre comment cela fonctionne.- Et personne ne dit que si tu n'es pas un expert, tu devrais t'arrêter… On dit que si tu n'es pas un expert, alors bienvenue dans le club, et si tu veux devenir un expert, super!Ne pensez pas que vous êtes assez expert pour déployer votre crypto maison pour sécuriser les secrets réels jusqu'à ce que vous ayez bien dépassé l'effet Dunning-Kruger.
J'aimerais aussi être un peu plus pédant (parce que dans ce cas, c'est important, car les développeurs PHP comme mes pairs, et beaucoup d'autres développeurs, lisent Stack Exchange et s'en vont en pensant qu'ils sont des experts) - "Algorithmes de hachage lent"devrait être" Fonctions de dérivation de clé ", dont certaines utilisent des algorithmes de hachage sécurisés comme primitives, et sont irréversibles comme les hachages ... mais les KDF ont des paramètres qui ajustent la quantité de travail nécessaire et sont conçus pour résister aux GPU etASIC.SHA2 est lent.PBKDF2 utilisant SHA2 est sécurisé.
@Ghedipunk Oui, j'entends par lent des fonctions de hachage comme «bcrypt» et «PBKDF2».
@Ghedipunk Pourquoi un attaquant n'a-t-il pas besoin d'accéder au code source, par exemple j'utilise un algo homebrewed sur le serveur, plus `bcrypt` et` salt` dans la base de données?
* Si * vous utilisez également une fonction d'étirement de mot de passe sécurisé, vous êtes aussi en sécurité que vous pouvez raisonnablement l'être, avec ou sans votre algorithme de hachage / crypto homebrew.Ce n'est souvent pas le cas des personnes qui utiliseraient la crypto homebrewed en production, cependant, bien qu'il y ait des nuances (et infosec est PLEIN de nuances), des conseils généraux sont donnés en supposant qu'un développeur naïf implémentera les choses de la manière la plus naïve.
Pour reformuler: la sécurité en profondeur est bonne, mais elle n'est aussi bonne que l'agrégat de chaque couche.Une couche faible ne réduit pas la sécurité * tant qu'elle ne réduit pas l'entropie * (c'est un gros problème), mais elle doit être utilisée avec des couches fortes, ce qui est une étape que beaucoup oublient.
Le poivre n'est pas pour vaincre les attaques de dictionnaire, mais pour s'assurer qu'une fuite de la base de données n'est pas suffisante pour déchiffrer les mots de passe.C'est fondamentalement un moyen sûr de "personnaliser" un algorithme de hachage.
@forest "s'assure qu'une fuite de la base de données n'est pas suffisante pour déchiffrer les mots de passe."De quelle manière?Assurez-vous que l'attaquant ne peut pas effectuer une attaque par dictionnaire.Vous pouvez affirmer qu'avec la fonction de hachage `long poivre + sel + md5 ', elle défend également les attaques par force brute.Mais c'est pour quelqu'un qui utilise de mauvaises fonctions de hachage comme «md5» uniquement.
@Rick Un poivre est comme un sel global stocké à l'extérieur de la base de données.Vous pouvez même le stocker dans le code source, il serait donc nécessaire de divulguer le code pour même commencer à déchiffrer les hachages.Considérez un poivre comme une version personnalisée d'un hachage qui ne vous oblige pas à être un cryptographe avec des décennies d'expérience nécessaires pour _concevoir_ un hachage ou une modification personnalisé.Un poivre offre une protection parfaite contre une fuite de base de données.
Il vous manque un type d'attaque: la cryptanalyse ... De nombreux algorithmes cryptographiques conçus par des cryptographes, même bien établis, s'avèrent faibles dans certaines conditions - et cela peut souvent être déterminé sans l'algorithme.Supposons que j'ai une attaque "en clair connu" - je peux spécifier du texte arbitraire, puis obtenir le texte chiffré, puis utiliser des méthodes statistiques pour trouver les faiblesses de l'algorithme.
@Blackhawk Ce sont vraiment très faciles à éviter.Sans oublier que pour le hachage de mot de passe, même le hachage le plus faible (et l'un des plus anciens), MD4, n'est vulnérable à aucune attaque qui rend possible le craquage de mot de passe.Bien sûr, étant un hachage rapide et non un KDF, il est toujours mauvais à utiliser pour les mots de passe, mais la cryptanalyse n'est pas un problème.Enfer, c'est même vrai avec l'ancien hachage qui est venu _avant_ lui, MD2!
Peter
2019-07-04 00:06:53 UTC
view on stackexchange narkive permalink

Bien qu'il soit utile d'utiliser un algorithme personnalisé "caché", il existe déjà un moyen simple et bien établi de créer des algorithmes de hachage sécurisés personnalisés: Pepper *

Parce que le très bon marché , une option très rapide et très sûre d'utiliser un Pepper existe, les gens qui écrivent à la place un algorithme cryptographique à partir de zéro pour être "plus sûr" sont toujours des novices. Donc non seulement le "protocole de Dave" est une perte de temps et d'argent, mais c'est aussi un protocole (supposé) sécurisé écrit par quelqu'un qui ne connaît pas grand-chose des protocoles sécurisés. Et cela est généralement considéré comme un choix imprudent, quelle que soit la sécurité réelle (ou l'absence de sécurité) dans le protocole de Dave.

* En bref, un poivre est un sel secret qui est le même pour tous les utilisateurs.

Volker Siegel
2019-07-03 17:08:54 UTC
view on stackexchange narkive permalink

Règle générale: Ne faites pas de sécurité à la maison.

Parce que cela va souvent mal. Et la personne qui l'a écrit ne peut pas le tester, si quelqu'un a une mauvaise hypothèse en l'écrivant, il / elle l'a toujours lors du test. Un test indépendant est étonnamment coûteux / prend du temps - bien plus que de l'écrire.

Vous devez également inclure toutes les modifications associées. Savoir "qu'il ne peut pas y avoir de problème, parce que ..." n'est tout simplement pas une approche valable. Pour les mêmes raisons que ci-dessus.

La sécurité des logiciels est un sujet difficile. C'est tellement difficile qu'il est même difficile de comprendre à quel point c'est difficile.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 4.0 sous laquelle il est distribué.
Loading...