WebCrypto
Les problèmes de cryptographie dans le javascript côté client (navigateur) sont détaillés ci-dessous. Toutes ces préoccupations, à l'exception d'une seule, ne s'appliquent pas à l'application WebCrypto API qui est maintenant raisonnablement bien soutenu .
Pour une application hors ligne, vous devez toujours concevoir et mettre en œuvre un keystore sécurisé.
Remarque : Si vous utilisez Node.js, utilisez le module intégré crypto API.
Cryptographie native en Javascript (avant WebCrypto)
Je présume que la principale préoccupation est que quelqu'un ayant un accès physique à l'ordinateur lise les données. localStorage
pour votre site, et vous voulez que la cryptographie aide à empêcher cet accès.
Si quelqu'un a un accès physique, vous êtes également ouvert à des attaques autres et pires que la lecture. Celles-ci incluent (mais ne sont pas limitées à) : keyloggers, script modification hors ligne, script injection locale, empoisonnement du cache du navigateur et redirections DNS. Ces attaques ne fonctionnent que si l'utilisateur utilise la machine après qu'elle ait été compromise. Néanmoins, un accès physique dans un tel scénario signifie que vous avez de plus gros problèmes.
Gardez donc à l'esprit que le seul scénario dans lequel la crypto locale a de la valeur est le vol de la machine.
Il existe des bibliothèques qui mettent en œuvre la fonctionnalité souhaitée, par exemple Stanford Javascript Crypto Library . Il y a cependant des faiblesses inhérentes (comme indiqué dans le lien de la réponse de @ircmaxell) :
- Manque d'entropie / génération de nombres aléatoires ;
- L'absence d'un magasin de clés sécurisé, c'est-à-dire que la clé privée doit être protégée par un mot de passe si elle est stockée localement, ou stockée sur le serveur (ce qui empêche tout accès hors ligne) ;
- Absence d'effacement sécurisé ;
- Absence de caractéristiques de synchronisation.
Chacune de ces faiblesses correspond à une catégorie de compromission cryptographique. En d'autres termes, même si vous avez le nom "crypto", il sera bien en deçà de la rigueur à laquelle on aspire dans la pratique.
Tout cela étant dit, l'évaluation actuarielle n'est pas aussi triviale que "la crypto Javascript est faible, ne l'utilisez pas". Il ne s'agit pas d'une approbation, mais strictement d'une mise en garde, qui exige que vous compreniez parfaitement l'exposition aux faiblesses mentionnées ci-dessus, la fréquence et le coût des vecteurs auxquels vous êtes confrontés, ainsi que votre capacité d'atténuation ou d'assurance en cas d'échec : La crypto Javascript, malgré ses faiblesses, peut réduire votre exposition mais uniquement contre les voleurs aux capacités techniques limitées. Cependant, vous devez présumer que la crypto Javascript n'a aucune valeur contre un attaquant déterminé et capable qui cible ces informations. Certains considéreraient qu'il est trompeur de qualifier les données de "cryptées" alors que l'on sait que tant de faiblesses sont inhérentes à l'implémentation. En d'autres termes, vous pouvez réduire marginalement votre exposition technique, mais vous augmentez votre exposition financière en cas de divulgation. Chaque situation est différente, bien sûr - et l'analyse de la réduction de l'exposition technique à l'exposition financière n'est pas triviale. Voici une analogie illustrative : Certaines banques exigent des mots de passe faibles En effet, leur exposition aux pertes dues à des mots de passe faibles est inférieure au coût pour l'utilisateur final de la mise en place de mots de passe forts.