2010-01-17 20 views
5

Je suis intéressé à avoir quelque chose que je crypte en utilisant une clé publique sur un serveur LAMPhp, décrypté en utilisant la clé privée appropriée sur le client web (firefox au moins, mieux si c'est javascript standard)obtenir firefox pour déchiffrer en utilisant la partie privée du certificat client

Notez que ce que je veux faire n'est pas simplement d'avoir une connexion cryptée utilisant SSL/https. Ou même d'utiliser des certificats clients basés sur un navigateur comme méthode de contrôle d'accès/de connexion. Je sais comment faire ces deux choses. Ce que je veux faire, c'est plus comme envoyer des emails avec des clés gpg. Je veux être capable de créer un court message que je crypterai avec une clé publique d'utilisateur qui, elle seule, peut déchiffrer à l'aide de sa clé privée. Ce que je cherche, ce n'est pas la confidentialité atteinte automatiquement par ssl, mais la possibilité d'autoriser seulement certains utilisateurs à déchiffrer des messages. Je sais que je peux facilement le faire avec gpg ou peut-être SMIME, et peut-être que c'est la meilleure façon, mais je préférerais une alternative basée sur le Web. Firefox etc ont un magasin de certificats, et je sais que les clés privées qui y sont conservées sont peu susceptibles d'être exportables en javascript pour des raisons évidentes de sécurité, mais je suppose qu'il existe un moyen d'utiliser les certificats des appels javascript pour décrypter quelque chose ..

La raison pour laquelle je voudrais faire cela, c'est que j'ai besoin d'une méthode sécurisée pour donner un mot de passe généré aléatoirement à un administrateur particulier. J'essaye de mettre en application la translucidité complète de base de données et la cryptographie de clé publique semble comme une partie importante de cet effort. Mais c'est un cas d'utilisation que j'ai de la difficulté à aborder sans ce genre de capacité.

donc du côté php je voudrais utiliser les appels de chiffrement OpenSSL comme si ...

<?php 

$browsers_public_key = get_it_from_the_browser_via_apache_maybe(); 

openssl_public_encrypt($data,$encrypted_ends_up_here,$browsers_public_key); 

echo "<html><head> 
<script type='javascript'> 
     function decrypt_textarea(){ 
      ?? 
    } 
</script> 
</head> 
<body><textarea id='decrypt_me'> $encrypted_ends_up_here </textarea> 
<div id='where_the_plaintext_goes'> </div> 
</body> </html>"; 

?> 

Notez que j'ai trouvé via stackedoverflow nombreuses bibliothèques encrypton javascript bien ... mais je veux vraiment utiliser les touches importé dans Firefox selon MyOpenId.com ou CaCert.org

Est-ce que quelqu'un sait si c'est possible?

Merci, -FT

Répondre

-1

Vous ne gérez pas SSL dans votre PHP. SSL est géré par le serveur Web automatiquement. Si vous utilisez Apache, voici un tutoriel simple:

http://www.debian-administration.org/article/Setting_up_an_SSL_server_with_Apache2

L'idée est que vous écrivez votre code comme d'habitude, et lorsque l'utilisateur accède à votre site en utilisant le protocole HTTPS, le serveur crypte automatiquement la connexion. Du côté client, le navigateur est capable d'utiliser les clés privées qu'il possède déjà pour déchiffrer automagiquement la connexion et présenter le code à l'agent utilisateur.

Espérons que cela aide!

+0

J'ai précisé que je n'ai pas besoin de SSL ici. Je sais comment chiffrer la connexion elle-même. Je suis à la recherche des fonctionnalités de confidentialité du cryptage à clé publique, mais dans un navigateur Web plutôt que gpg .. – ftrotter

2

Maintenant que je comprends ce que vous dites, je peux vous donner une réponse ferme :)

Le mieux que je peux vous dire est que vous ne pouvez pas obtenir le cryptage décent dans la façon dont vous cherchez à fais le. Le cryptage de clé privée (à savoir RSA) utilise des nombres très, très, très grands pour faire le cryptage. L'utilisation de petits nombres est très simple à déchiffrer sur le plan informatique (il n'y a que très peu de nombres premiers) et les nombres deviennent extraordinairement rapides. Fondamentalement, avec RSA, vous devez prendre de grands nombres et les élever à de grands exposants. JavaScript est capable de supporter de très grands nombres, mais vous allez frapper un mur avec des performances. Avec une clé de 512 bits, le cryptage de quelques kilo-octets peut prendre quelques secondes, alors que le décryptage peut prendre de quelques secondes à quelques minutes. La raison pour laquelle JS est si lent est simplement parce que ce n'est pas un langage compilé.Bien sûr, vous pourriez réduire la taille de la clé, mais tout ce qui dépasse quelques kilo-octets et vous avez un problème. En outre, RSA est intrinsèquement non sécurisé dans une page Web parce que la clé privée est transmise à côté des données à déchiffrer (sauf si elle a été transférée plus tôt), ce qui permet à quiconque reçoit la page de déchiffrer les données.

Je vais supposer que vous cherchez à faire cela parce que vous voulez obscurcir du code de votre utilisateur ou un client, donc je vais vous recommander de vérifier le cryptage XOR. Certes, il est loin d'être aussi sûr que RSA, mais il utilise des principes qui peuvent être très sûrs s'ils sont utilisés correctement. Par exemple, si vous utilisez une clé aléatoire qui est utilisée une seule fois et a la même longueur que vos données/code (un tampon à usage unique), votre cryptage est "incassable". Encore mieux, le cryptage XOR est rapide. Voici quelques ressources:

http://guymal.com/mycode/xor_js_encryption/

http://javascript.internet.com/passwords/xor-encryption4.html

Espoir vous avez la chance avec ce que vous essayez de faire!

+0

C'est un point très intéressant, et je l'ai modifié, car il est si utile ... Toujours pas adresse ma demande. Il est tolérable que mon application prenne beaucoup de temps pour que les choses soient décodées, puisque ce sera une fonction d'administrateur seulement. Je vais ajouter plus de texte décrivant «pourquoi» je veux faire ça ... – ftrotter

1

Je cherche exactement la même chose que vous et je voulais aussi utiliser les fonctions openssl de php. J'étais heureux de voir que sur phpside tout fonctionnait bien avec une clé privée/publique (encrypt/decrypt) et que je voulais maintenant trouver un moyen d'utiliser privatekey sur clientide comme vous le faites.

!!!

SI vous trouverez quelque chose s'il vous plaît laissez-moi savoir par email:

pki (at) life.de

!!! Et pour l'aspect performance: Vous crypteriez les grandes parties avec un cryptage symétrique et seulement la clé de décryptage avec la clé publique du client pour l'excaver. Donc, vous n'avez pas besoin d'enrypter beaucoup de kb.

Mais il semble être une impasse avec firefox, mais avec IE et ActiveX, il semble possible avec CAPICOM (je n'avais pas beaucoup lu à ce sujet maintenant). hxxp: //geekswithblogs.net/shahed/archive/2007/05/03/112232.aspx

Mais pour JavaScript/PHP jetez un oeil à (et lire tous les commentaires sur FAQ et autres pages, aussi! peut-être a été mentionné communication bidirectionnelle): hxxp: //www.jcryption.org/

hxxp: //www.zend.com//code/codex.php ozid = 1323 & unique = 1

Chiffrement Public/Privé à code Javascript pur hxxp: //shop-js.sourceforge.net/crypto2.htm

A helful FireFox-Addon pour PKI: hxxps: //addons.mozilla.org/en-US/firefox/addon/4471 hxxp: //www.mozilla.org/projects/security/pki/nss/tools/index. html

PHP avec OpenSSL sur Serverside/.NET sur InfoClient hxxp: //www.csharpbydesign.com/2008/04/asymmetric-key-encryption-with.html

Javascript OpenPGP

hxxp : //www.hanewin.net/Crypter/

PS: mécanisme stupide me empêche l'affichage des liens ...

3

Cela a été un moment que vous avez posé cette question, mais si vous ou quelqu'un d'autre est à la recherche d'une solution potentielle à ce problème ou semblable, ils devraient vérifier le projet Forge JavaScript:

http://github.com/digitalbazaar/forge/blob/master/README

Ce projet a une implémentation SSL JavaScript qui vous permettra d'inclure un certificat côté client lors de la communication avec Apache. Vous pouvez également effectuer manuellement le décryptage RSA à l'aide de la clé privée associée (à laquelle vous avez accès en JavaScript). Par exemple, le JavaScript pourrait obtenir/publier sur le serveur et inclure son certificat côté client. Apache peut lire ce certificat, utiliser la clé publique pour crypter les données appropriées, puis renvoyer ces données au client. Le client pourrait alors utiliser sa clé privée (en JavaScript) et déchiffrer les informations et faire quelque chose avec lui. Ce chiffrement supplémentaire n'est probablement même pas nécessaire, cependant, si votre serveur peut authentifier le certificat côté client en tant que destinataire approprié du secret que vous essayez de transmettre. Le projet Forge dispose également des API pour créer un système d'importation/exportation de clés et de certificats depuis/vers Firefox ou d'autres navigateurs (si cela est encore nécessaire pour une raison quelconque). Une petite aide d'openssl peut être nécessaire pour obtenir les clés/certs dans le format correct pour l'import/export (pem => pkcs12), mais un exemple de la façon dont cela fonctionne peut être trouvé dans une démonstration JavaScript de WebID. CodeWeb est un système d'authentification par certificat côté client:

démonstration de gestion de CodeWeb: https://webid.digitalbazaar.com/manage/

démonstration d'authentification CodeWeb: https://payswarm.com/webid-demo/

Notez que les certificats SSL pour les sites ci-dessus sont auto-signés et nécessitera des exceptions temporaires à ajouter à votre navigateur pour les voir. Les sites ne vous obligent pas à entrer des informations personnelles, ils sont uniquement à des fins de démonstration. Cependant, si vous allez au premier lien, vous pouvez générer des clés dans le navigateur (il utilise Forge JavaScript pour le faire) et ensuite vous pouvez voir la clé privée et le certificat qui ont été générés, au format PEM, dans la liste en haut de la page. La clé et le certificat sont conservés via le stockage local Flash.

Près de 100% (sinon cela) de la source du site de gestion WebID est visible car il s'agit principalement de JavaScript. De plus, le projet Forge lui-même (voir le lien github) est opensource.