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.