8
votes

Décryptage OpenSSL en JavaScript dans le navigateur

Je recherche un moyen de trouver des messages codés de Clientside Decode RSA OpenSL.

idée:

Les données spéciales sont uniquement stockées cryptées avec une clé publique sur le serveur afin que personne ne puisse voir les données réelles - même en cas de hacks de serveur.
Un administrateur de l'administrateur peut alors "ouvrir" ces fichiers en les transférant sur le navigateur et que certains code JavaScript décodent les données de manière à ne jamais déchiffrer sur le serveur, uniquement sur les clients sécurisés.
J'en ai vraiment besoin d'être décodé Direclty dans le navigateur avec JavaScript personnalisé, car ces données doivent ensuite être utilisées par certains algorithmes clients dans JS. de
de
Problème:
Il ne semble y avoir aucune bibliothèque OpenSSL en JavaScript ou je ne l'ai pas encore trouvé. Bien qu'il y ait plusieurs pure implémentation de JS de RSA, ils ne mettent en œuvre que l'algorithme de RSA uni, mais la LIer RSA n'est pas sécurisée d'être utilisée comme chiffre d'éléments et a des attaques comme "attaques en plainte choisie" .
> Est-ce que quelqu'un connaît une implémentation JavaScript du décodage OpenSSL ou un plugin pour Firefox / Chrome qui ajoute ces fonctionnalités au document? Ou tout autre cryptage asymétrique sécurisé intégré à JavaScript?


2 commentaires

Il y a une légère faille dans cette approche: si votre serveur est piraté, il est probable que l'attaquant puisse également modifier le JavaScript qu'il sert, ce qui pourrait envoyer de manière transparente le contenu déchiffré sur le serveur (et donc à l'attaquant). S'appuyant sur JS implique que le côté client ne soit plus sécurisé non plus lorsque ce type d'attaque se produit. Vous feriez mieux de développer une application autonome pour cela, peut-être une webStart de Java (ou une applet ou une applet) signée, tant qu'elle n'est pas signée avec une clé privée détenue sur le serveur.


Bruno Vous avez tout à fait raison, mais je n'ai pas besoin d'une implémentation de JS d'OpenSSL en cours d'exécution sur la page Web qui pourrait être compromise par le serveur. Je veux écrire une extension pour un navigateur qui ne peut pas être compromis par un code JS malveillant sur une page Web.


4 Réponses :


1
votes

Encryption est complexe et coûteux - particulièrement asymétrique d'ancryppyption (dans la plupart des cas, le cryptage asymétrique n'est utilisé que pour chiffrer une clé d'algorithme symétrique générée aléatoirement).

Il existe des implémentations de RSA (et probablement d'autres algorithmes asymétriques dans JavaScript) et, dans certains cas, des implémentations compatibles dans d'autres langues (généralement c) - essayez Google pour des spécificités - mais je ne suis au courant de personne qui gère X509 cryptage. OTOH Écrire un applet Java pour le faire serait trivial.

Mais pourquoi déranger? De ma compréhension de ce que vous avez écrit, vous obtiendrez autant de fonctionnalité pour beaucoup moins d'effort en utilisant un algorithme symétrique et n'envoie jamais la clé au serveur:

  1. permet à l'utilisateur de saisir certaines données dans une page Web
  2. Autoriser l'utilisateur à entrer une clé de cryptage
  3. chiffrer les données à l'aide de la touche
  4. Envoyez les données cryptées sur le serveur
  5. Fournissez une page de déchiffrement dans laquelle l'utilisateur peut récupérer le contenu crypté et entrer la clé
  6. déchiffrer le contenu

3 commentaires

"... Mais je ne suis au courant d'aucun qui gère le cryptage X509": il n'y a rien de spécifique sur le cryptage X.509. Si c'est un cert X.509 avec une clé RSA, ce qui compte est l'algorithme RSA, pas tellement l'emballage X.509 (plus donc, car seule la clé privée est nécessaire pour déchiffrer, ce qui est indépendant de la manière dont la clé publique est "Emballé": Dans X.509 CERT, PGP CERT ou clé publique ordinaire). (La même chose s'applique lors de l'utilisation d'une clé DSA dans le certificat X.509, avec DSA.)


Je suis conscient que le cryptage asymétrique coûte cher, mais je devrai coder seulement quelques octets. Le cryptage symétrique n'est pas des solutions car le serveur a (temporaire) de connaître les clés, ceci est un non-aller à cette fin. Bien que l'utilisateur ne soit pas au courant du cryptage, il envoie les données au serveur sans aucune connaissance du cryptage et qu'il est stockée là-bas chiffré pour l'administrateur pour examiner les données.


@Tobias p.: "Server a (temporaire) pour connaître les clés" - Vous pensez qu'en utilisant de nombreux algorithmes sophistiqués, vous rendez le système sécurisé. La seule raison pour laquelle le serveur aurait besoin de connaître temporairement les clés correspond à un accès transitoire au contenu crypté - et vous pouvez le faire en renvoyant une copie non cryptée avec le crypté.



0
votes

pense à cela. S'il y a un piratage de serveur, le pirate informatique aura accès à vos données cryptées et à tout le code source de votre site. y compris celui utilisé pour déchiffrer les données. et cela peut obtenir ceux de l'interface du site Web en regardant la source de la page.


5 commentaires

Cela n'obtiendra pas la clé privée de l'utilisateur final, cependant. Cela nécessite toujours une action de l'utilisateur légitime.


@ Thebrain: Qu'est-ce que tu veux dire? Bien sûr, vous pouvez implémenter des algorithmes RSA en JavaScript, mais comment aidez-t-il l'attaquant à accéder à la clé privée? Pour un système sécurisé, le navigateur ne doit jamais libérer la clé privée du JS de toute façon.


@Bruno: Oui, vous avez réalisé le problème, mais un plug-in Firefox - qui est codé dans JS - n'est pas accessible par une page Web attaquée, la clé pouvait donc être stockée de manière sécurisée mais permettant même d'interagir avec les données cryptées.


@ Thétèrent: Je suis déjà tombé sur la bibliothèque de Stanford, mais ils ne mettent en œuvre que de la RSA plaine qui a quelques faiblesses.


@Tobias, en effet, s'il s'agit d'un plugin, c'est différent, c'est plus semblable à une application autonome, alors (l'API DomCrypt, liée à ma réponse issue de ces lignes).



4
votes

Alors que je soulignais dans un commentaire à votre question, le vecteur d'attaque que vous envisagez (serveur compromis) implique que le JavaScript est susceptible d'être compromis également, auquel cas le code JavaScript s'exécutant sur le client. T être de toute façon de toute façon. (Il serait assez facile de rendre le JavaScript à envoyer les données déchiffrées sur le serveur avec une demande asynchrone à l'arrière-plan: à nouveau, car le serveur serait sous le contrôle de l'attaquant, il n'y aurait pas besoin d'astuces pour contourner la même chose -origine les politiques là-bas.)

Je suggérerais de descendre la route d'une application autonome (telle que Java WebStart), peut-être signé (avec une clé privée qui n'est pas conservée sur le serveur).

Si vous êtes toujours prêt à aller de l'avant avec ce type d'architecture, évitez de libérer la clé privée de l'utilisateur dans le JavaScript à tout prix. Cela pourrait compromettre la clé privée de l'utilisateur, pas seulement les données cryptées.

Lorsque vous utilisez une clé privée de votre navigateur pour l'authentification du certificat client SSL / TLS, la clé privée n'est pas exposée à un code utilisé par le serveur. Il est utilisé par le navigateur de la poignée de main et le serveur obtient le certificat (qui est public), mais la clé privée ne va nulle part près de ce que le code HTML + JS peut voir. (En fait, dans OSX avec Safari, la clé privée est utilisée par la bibliothèque SSL / TLS sous-jacente, et même non exposée au processus utilisateur.)

Les bibliothèques JavaScript pour RSA que j'ai vu avoir besoin d'un usage direct de la clé privée, c'est-à-dire qu'ils doivent pouvoir utiliser directement l'exposant privé directement. Ce n'est clairement pas bon si vous êtes dans une situation, vous ne pouvez pas faire confiance au serveur.

Être capable d'utiliser une clé privée dans le navigateur pour les opérations RSA, sans laisser le script obtenir que le matériau privé lui-même nécessiterait une intégration plus étroite avec le navigateur, en particulier, une API de signer et de déchiffrerait ces fonctions. Directement dans le mécanisme de sécurité du navigateur, sans exposer le matériel de clé privé (dans l'ensemble, une approche similaire de ce que PKCS n ° 11 offre aux applications en l'utilisant).

aussi loin que je suis au courant, l'actuel API JavaScript Mozilla Crypto ne fournit pas Fonctions pour déchiffrer / signer à l'aide des navigateurs (ce n'est que pour la demande de certificat et la génération de clés). Il semble y avoir des projets de faire cela, bien que:


3 commentaires

Un firefox pourrait stocker la clé privée sécurisée, même si la page Web a été défaçée par un attaquant. Je suis déjà tombé sur l'API de Crypto Mozilla et malheureusement, cela ne le soutient pas encore, je n'avais pas à demander si cela aurait été soutenu :-(


En effet. Pour être honnête, je n'ai pas essayé DomCrypt (comme mentionné ici), mais c'est aussi open-source, il vaut donc probablement la peine d'enquêter: GITUB.COM/DAVIDDAHL/DOMCRYPT . Vous aurez certainement besoin d'installer le plugin, mais cela ne semble pas être une mauvaise solution pour ce que vous recherchez.


Pas la réponse que j'espérais obtenir, mais je ne vais pas utiliser mon plan de sauvegarde pour créer un outil indépendant installé alors qu'il ne semble pas y avoir de bonne solution interopérable dans JavaScript pour un plugin Firefox personnalisé



0
votes

Au lieu de s'appuyer sur Web Server pour vous envoyer à la fois les données cryptées et le code JavaScript associé pour déchiffrer les données (qui pourraient être corrompues dans le cas d'un serveur compromis), vous ne pouvez télécharger que les données du serveur Web et du déchiffrement. Avec une application autonome ou une page Web avec JavaScript qui ne provient pas du même serveur Web (pourrait provenir d'un autre serveur ou d'un fichier local). De cette façon, il n'y aurait pas de réponses renvoyées au serveur d'origine ni à l'attaquant.

Les données conservées sur le serveur peuvent être cryptées avec une clé que vous seul connaissez et que vous pouvez déchiffrer (AES ou RSA) et le serveur ne pouvait être que pour le stockage. Pour le décryptage, téléchargez d'abord des données sur une machine locale fiable, vous n'aurez donc que vous aurez accès à des données non cryptées, bien sûr pendant une durée très limitée.

Déconnectez ce Implémentation native de TLS en JavaScript.

Voici un guide de Activer le sous-système Windows pour Linux dans Win 10 à installer Bash, qui vient avec SSL. Vérifiez votre version et obtenez le dernier.


0 commentaires