Que devraient savoir les programmeurs Web sur la cryptographie? [fermé]

27

Les programmeurs qui créent des sites Web / applications Web devraient-ils comprendre la cryptographie? Je n'ai aucune idée du fonctionnement de la plupart des algorithmes cryptographiques, et je ne comprends vraiment pas les différences entre md5 / des / aes / etc. L'un d'entre vous a-t-il trouvé le besoin d'une compréhension approfondie de la cryptographie?

Je n'en ai pas eu besoin, mais je me demande si je manque peut-être quelque chose. J'ai utilisé le hachage salt + md5 pour crypter les mots de passe et je dis aux serveurs Web d'utiliser SSL. Au-delà de cela, je ne peux pas dire que j'ai utilisé beaucoup d'autre chose, ni dire avec certitude à quel point ces méthodes sont sécurisées. Je ne les utilise que parce que d'autres personnes prétendent qu'elles sont sûres.

Avez-vous déjà trouvé un besoin d'utiliser la cryptographie dans la programmation Web en dehors de ces deux exemples simples?

davidhaskins
la source
4
Ils devraient en savoir suffisamment pour savoir qu'ils ne devraient pas le faire.
SLaks
@SLaks: +1 100% d'accord. J'ai écrit une réponse à ce fil pour expliquer pourquoi.
Chris Jester-Young,

Réponses:

41

Les programmeurs Web doivent savoir qu'ils ne devraient jamais essayer d'implémenter eux-mêmes la cryptographie.

En particulier, cela signifie qu'aucun non-expert en sécurité ne devrait toucher directement l'une des primitives cryptographiques. Ils ne devraient pas penser au niveau AES, SHA-1, etc. Au lieu de cela, ils devraient utiliser des fonctions de haut niveau pour crypter et signer les messages, et pour "hacher" les mots de passe.

Pourquoi? Parce que sinon, les gens se trompent en pensant que:

  • AES-256 est un "excellent cryptage", malgré le fait qu'il l'utilise en mode ECB, ou en utilisant des valeurs IV non aléatoires, etc. (Dans certains modes, des IV non aléatoires mais uniques sont corrects. Dans d'autres, pas tellement de.)
  • Ils peuvent utiliser la même clé symétrique pour crypter plusieurs messages (ou pire, stocker la clé symétrique dans le code pour une utilisation directe).
    • Ils pourraient même décider d'utiliser directement une phrase secrète comme clé, sans utiliser de fonctions de dérivation de clé.
  • Ils peuvent utiliser RSA pour chiffrer directement les données.
  • Ils peuvent simplement "saler et MD5" leurs mots de passe pour les protéger. (Si vous pensez que les tables arc-en-ciel sont le maillon le plus faible, détrompez-vous .)

Juste pour être sur la même page, aucun des éléments ci-dessus n'est correct . Si vous n'obtenez pas cela, alors vous ne devriez pas toucher à la crypto avec un poteau de 10 pieds! (AES-256 est un excellent cryptage, mais seulement si vous l'utilisez correctement. "Ce n'est pas la taille qui compte, c'est ce que vous en faites." :-))

De quel type de fonctions de haut niveau je parle? Je recommande personnellement l'utilisation d'une bibliothèque OpenPGP (pour les données au repos) ou SSL (pour les données en mouvement). Ces protocoles spécifient de manière rigide l'utilisation correcte des algorithmes asymétriques, symétriques et de hachage. Par exemple, avec OpenPGP:

  • Il n'utilise pas RSA pour crypter directement les données, mais génère à la place une clé de session aléatoire (symétrique) par message (ce qui est important) et utilise RSA pour crypter cette clé de session.
  • Il utilise une fonction de dérivation de clé pour transformer les mots de passe en clés. (Dans le langage OpenPGP, cela s'appelle un S2K, mais je pense que "fonction de dérivation de clé" est le terme le plus standard.)
  • Il gère le choix d'un bon mode, vous ne finirez donc jamais par utiliser ECB.
  • Il gère la gestion des clés pour vous, vous n'avez donc pas à prendre de décisions ad hoc sur les clés fiables, etc.

Résumé: si vous n'êtes pas un expert en sécurité et que vous pensez au niveau d'AES, ou SHA-1, ou (Dieu nous en préserve) MD5, vous vous trompez . Utilisez une bibliothèque écrite par des experts en sécurité (comme Bouncy Castle), qui implémente des protocoles conçus par des experts en sécurité (comme OpenPGP pour le chiffrement, ou bcrypt ou scrypt pour le hachage de mot de passe), au lieu de lancer le vôtre.

Je ne suis en aucun cas un expert en cryptographie, mais j'en sais assez pour ne pas essayer de concevoir mes propres protocoles ad-hoc. Juste pour être clair, tout ce post est du matériel Cryptography 101 . Donc, si ce message n'a pas de sens à 100%, vous ne devriez certainement pas vous approcher de la cryptographie.

Chris Jester-Young
la source
4
impressionnant. J'ai adoré le billet de blog lié à "Détrompez-vous". chargen.matasano.com/chargen/2007/9/7/…
davidhaskins
+1, mais utiliser plusieurs fois la même clé symétrique. C'est à cela que sert l'IV (sinon vous n'en auriez pas besoin).
orip
1
De plus, Colin Percival de scrypt (et d'autres) renommée a un excellent article intitulé "Cryptographic Right Answers" qui présente les décisions de crypto-pain que vous devez prendre. SSL est très problématique (la révocation des clés est très difficile à implémenter). Plus d'infos ici: daemonology.net/blog/…
orip
@orip D'accord, mais je dirais que l'utilisation de la même clé avec un IV différent est généralement plus utile dans le cas où votre message est plus long que la taille de bloc du chiffrement symétrique que vous avez choisi, plutôt que pour des messages distincts, où vous n'auriez pas contexte pour garder une trace des IV utilisés pour les messages précédents. En outre, d'accord avec l'article de Colin Percival.
Chris Jester-Young
1
@Ajoy J'ai changé le lien pour quelque chose de plus pertinent.
Chris Jester-Young
14

Vous n'avez pas besoin de savoir autre chose que les bases de la cryptographie (qu'est-ce qu'un hachage, qu'est-ce qu'un sel, à peu près à quel point il est difficile de casser ce cryptage ou cela et ainsi de suite), mais vous devez en savoir assez sur la sécurité dans général.

Les principaux domaines de sécurité que vous devez absolument connaître en tant que développeur Web:

  1. Injection SQL. C'est probablement le trou le plus dangereux qu'un développeur Web puisse percer sur un système.
  2. Scriptage intersite et cookies.
  3. Spambots et captchas.
  4. Injection SQL. On ne saurait trop souligner combien cela est important.
biziclop
la source
Ne rien comprendre de ce que vous faites est très dangereux. Ne pas savoir quelle différence entre un hachage de résumé de message et un hachage cryptographique peut vous ruiner. Ne pas savoir saler peut vous ruiner.
Incognito
@ user1525 C'est ce que je voulais dire comme les bases de la cryptographie. Vous n'avez certainement pas besoin de savoir comment fonctionnent réellement les algorithmes de cryptage.
biziclop
J'apprécie la réponse et je suis d'accord sur l'injection SQL et d'autres attaques, mais je posais vraiment des questions sur la cryptographie.
davidhaskins
2
@davidhaskins Oui, je pensais juste que cela valait la peine d'être souligné, car chaque niveau s'appuie sur le précédent. Savoir comment fonctionne AES ne vaut rien si vous ne sécurisez pas votre application à un niveau plus basique. D'après mon expérience, c'est un piège dans lequel de nombreux développeurs tombent (je l'ai fait plusieurs fois), pour se concentrer sur le chiffrement et perdre de vue son rôle dans la longue chaîne de sécurité.
biziclop
4

Je me souviens avoir vu cette conférence intitulée Ce que chaque ingénieur doit savoir sur la sécurité et où l'apprendre , le conférencier est Neil Daswani et c'est une conférence Google Tech qu'il a donnée, pourrait être un bon point de départ!

Ne s'applique pas uniquement aux programmeurs Web, mais la question devrait peut-être être renommée "Que doivent savoir les programmeurs sur la sécurité?" car ils n'ont pas besoin d'en savoir plus que les bases de la cryptographie (aussi intéressantes soient-elles)


la source
2

La crypto est utile dans de nombreuses situations. Un exemple que nous avons utilisé est le cryptage d'un cookie de session créé et défini par un hôte Win / IIS pour être utilisé sur un hôte LAMP.

Si vous devez implémenter le cryptage (par opposition au hachage md5 / sha1), certains termes de base sont importants - tels que la différence entre le cryptage symétrique et asymétrique. En plus de comprendre la différence entre les deux, vous devez comprendre ce que vous, en tant que développeur Web, devez faire pour stocker et sécuriser correctement les clés de déchiffrement. Par exemple, si vous développez une application à déployer sur un hôte sur lequel vous n'avez pas un contrôle administratif complet, comme un hôte partagé, par rapport au déploiement sur un serveur où tous les administrateurs sont connus et approuvés.

Michael
la source
2

À mon avis, vous devriez tout savoir sur la cryptographie que quelqu'un qui attaque votre code saura. Vous devez comprendre les hachages, le sel, le caractère non aléatoire du hasard, les principaux algorithmes de chiffrement (RSA, 3DES, AES, etc.), SHA-1 / MD-5 / et al. Vous n'avez pas besoin de les mémoriser, mais vous devez au moins savoir que l'efficacité d'un algorithme de hachage et comment le rendre plus fort. Vous devez savoir ce que sont les collisions et les faux positifs. Vous ne devriez pas être en mesure de réciter les algorithmes de chiffrement, mais vous devez connaître leurs repères, lesquels sont idéaux pour quels scénarios. Vous devriez être en mesure de décrire et d'expliquer le cryptage symétrique vs asymétrique et quand les utiliser. Vous devez savoir ce qu'est l'ICP et comment il est utilisé. Vous devez savoir ce qu'est une autorité de certification et comment elle interagit avec vos serveurs.

Connaître les tenants et aboutissants de tout n'est pas aussi important que d'en connaître l'arrière-plan. Quels sont les points de référence de certaines choses (à quelle vitesse, quelle force, faiblesses, etc.).

Ces recommandations concernent les informations de niveau senior ou architecte. Si vous êtes juste un singe web ramant une rame, vous n'avez pas besoin de savoir quoi que ce soit. Votre architecte devrait savoir ce genre de choses. Si vous êtes en charge du site, de sa conception, de sa mise en œuvre, etc ... alors vous devez être familier avec tous ces concepts et être capable de converser intelligemment à leur sujet. Il n'est pas nécessaire de pouvoir l'enseigner, il suffit d'accepter et de diffuser des informations à ce sujet.

Joel Etherton
la source
2

Vous devez utiliser bcrypt (Blowfish) pour stocker les mots de passe plutôt que MD5; c'est un algorithme beaucoup plus lent , ce qui signifie qu'il est beaucoup plus difficile pour un pirate de deviner et de vérifier. En outre, bcrypt prend un facteur de travail comme paramètre, ce qui signifie qu'il peut devenir encore plus lent à mesure que de nouveaux ordinateurs sont introduits, de sorte qu'il est intégré à la pérennité.

Voir Comment stocker un mot de passe en toute sécurité pour plus d'informations.

chrisaycock
la source
0

Comme réponse assez générale à ce genre de questions, je pense toujours que vous devriez essayer d'avoir une compréhension de base de tout ce qui est lié à distance à ce que vous faites. Bien sûr, vous avez besoin d'une connaissance détaillée et précise de ce sur quoi vous travaillez réellement. Il est très difficile de prédire comment une certaine zone va évoluer, ce qui va être "à la mode" ou ce dont vous aurez besoin à l'avenir, donc avoir un large éventail de choses dont vous avez au moins "entendu" gardera de nombreuses portes s'ouvrent.

En ce qui concerne mon expérience personnelle dans la programmation Web, j'ai trouvé des notions de base de la cryptographie asymétrique et ce genre de choses utiles pour comprendre ce qui se passe sous le capot. J'aurais pu survivre sans cela, mais je dois dire que j'aime la cryptographie et les mathématiques, alors pourquoi pas.

Omar Kohl
la source