Existe-t-il des options de cryptage asymétrique pour JavaScript?

je dois transférer des informations sensibles sur un appel AJAX JavaScript, sur un canal non crypté (HTTP, pas HTTPS).

j'aimerais crypter les données, mais le cryptage du côté JavaScript signifie que j'expose la clé, ce qui rend le cryptage symétrique seulement un exercice de sécurité par l'obscurité.

Existe-t-il un cryptage asymétrique pour JavaScript? Comme ça, je peux garder la clé de décryptage du serveur secrète. (Je ne suis pas inquiet au sujet de la sécurité du serveur > messages JavaScript, seulement au sujet de la sécurité D'un certain JavaScript > message du serveur)

21
demandé sur Michael Stum 2011-05-25 01:06:16

5 réponses

la raison pour laquelle vous avez besoin de cryptage est probablement pour vous protéger contre un homme-dans-le-milieu. Il y a des scénarios où un attaquant est capable de renifler le trafic sans pouvoir le changer. Cette solution protégerait contre cette menace, mais elle ne fournirait aucune protection contre un homme-dans-le-milieu qui est en mesure de modifier le trafic.

si l'attaquant peut changer le trafic, alors il sera également en mesure de changer le script qui fait le cryptage. L'attaque la plus facile serait de simplement supprimer le cryptage complètement du script. Si vous n'avez pas de https, et qu'un man-in-the-middle est possible (ce qui est le cas dans presque tous les scénarios), alors vous n'avez aucun contrôle sur le html ou le javascript qui est présenté à l'utilisateur final. L'attaquant peut réécrire complètement votre code html et javascript, désactiver le cryptage, créer de nouveaux champs de formulaire dans votre formulaire, etc. Https est une condition préalable à la communication sécurisée dans le web-canal.

13
répondu sstendal 2011-05-25 07:54:36

je l'ai fait. J'utilise ce chiffrement asymétrique RSA côté client JavaScript pour empêcher que les informations de connexion soient envoyées en texte clair via HTTP.

le but est d'empêcher les attaques de rediffusion de requêtes login basées sur le sniffage du réseau. Bien sûr, ce N'est pas aussi sûr que HTTPS car il ne résisterait pas aux attaques de l'homme-dans-le-milieu, mais il peut être suffisant pour les réseaux locaux.

Le chiffrement côté client utilise Travis Tridwell de l' excellent travail qui est basé sur JSBN . La page Web de Travis peut également générer les clés privées et publiques RSA (si vous êtes trop paresseux pour utiliser openssl ). Les clés sont générées au format PKCS#1 PEM. Je crypte username+password+timeInMs+timezone de sorte que le contenu crypté change à chaque connexion.

côté serveur, mon code Java lire le fichier PKCS#1 PEM en utilisant Apache Jmeter's org.apache.jmeter.protocol.oauth.sampler.PrivateKeyReader :

PrivateKey pk = (new PrivateKeyReader("myPrivateKeyFile.pem")).getPrivateKey();

puis je décrypte le contenu crypté en utilisant

byte[] enc = DatatypeConverter.parseBase64Binary(clientData);
Cipher rsa = Cipher.getInstance("RSA");
rsa.init(Cipher.DECRYPT_MODE, pk);
byte[] dec = rsa.doFinal(enc);
String out = new String(dec, "UTF8");

ensuite, je vérifie si le timestamp/timezone côté client correspond au timestamp/timezone côté serveur. Si le délai est inférieur à quelques secondes, le processus de connexion continue. Sinon, la requête est considérée comme une attaque replay et le login échoue.

5
répondu Julien Kronegg 2014-02-03 15:24:18

cette question semble avoir ce que vous cherchez, Javascript cryptography library to sign form data in browser le lien PGP: http://www.hanewin.net/encrypt / has RSA

3
répondu dnolan 2017-05-23 11:54:34

est-ce que le serveur > JavaScript envoie des messages par HTTPS?

si ce n'est pas le cas, rien n'empêche un homme au milieu de changer les scripts. Tout cryptage sera inutile si le code qui a accès aux données non cryptées est compromis.

3
répondu Baffe Boyois 2011-05-24 21:23:17

clé publique asymétrique / clé privée est le seul moyen de le faire. Pour se protéger contre les attaques MIM, le serveur peut Hasher la clé publique avec le mot de passe de l'utilisateur, puis l'utilisateur (dans le navigateur) calcule à nouveau le hachage-s'ils correspondent, alors l'utilisateur peut être sûr que la clé publique envoyée par le serveur n'a pas été altérée - cela dépend du fait que seuls le serveur et l'utilisateur connaissent le mot de passe de l'utilisateur.

PS j'ai voulu écrire ce qu'un commentaire comme celui serait plus approprié qu'une réponse, mais je n'ai pas assez de points :)

2
répondu user2677034 2014-05-16 16:37:16