2010-01-17 10 views
5

Sono interessato ad avere qualcosa che cifrare utilizzando una chiave pubblica su un server di LAMPhp, decriptato utilizzando la chiave privata appropriata sul client web (Firefox, almeno, meglio se si tratta di JavaScript standard)Get Firefox per decifrare utilizzando parte privata del certificato client

si noti che ciò che voglio fare è -non- solo di avere una connessione crittografata utilizzando SSL/HTTPS. O anche per utilizzare i certificati client basati su browser come metodo di controllo dell'accesso/accesso. So come fare entrambe le cose. Quello che voglio fare è più come l'email con le chiavi gpg. Voglio essere in grado di creare un breve messaggio che crittograferò con una chiave pubblica degli utenti che, solo loro, possono decifrare usando la loro chiave privata. Quello che sto cercando non è la privacy ottenuta automaticamente da ssl, ma la possibilità di consentire solo a determinati utenti di decodificare i messaggi. So che posso farlo facilmente con gpg o forse SMIME, e forse è il modo migliore, ma preferirei un'alternativa basata sul web.

Firefox ecc. Ha un archivio di certificati e so che le chiavi private presenti non sono esportabili in javascript per ovvi motivi di sicurezza, ma suppongo che ci sia un modo per -utilizzare- i certificati dalle chiamate javascript a decifrare qualcosa ..

La ragione per cui mi piacerebbe fare questo, è che ho bisogno di un metodo sicuro per dare una password generata in modo casuale a un amministratore particluar. Sto cercando di implementare la traslucenza del database completo e la crittografia a chiave pubblica sembra una parte importante di questo sforzo. Ma questo è un caso d'uso che ho problemi ad affrontare senza questo tipo di abilità.

Così sul lato php vorrei utilizzare le chiamate di crittografia OpenSSL in questo modo ...

<?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>"; 

?> 

Nota che ho trovato tramite stackedoverflow molte belle librerie javascript encrypton ... ma io in realtà voglio usare i tasti importati in Firefox come per MyOpenId.com o CaCert.org

qualcuno sa se questo è possibile?

Grazie, -FT

risposta

-1

non si gestisce SSL in PHP. SSL viene gestito automaticamente dal server Web. Se si utilizza Apache, ecco un semplice tutorial:

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

L'idea è di scrivere il codice come normale, e quando l'utente accede al tuo sito utilizzando il protocollo HTTPS, il server codifica automaticamente la connessione. Sul lato client, il browser è in grado di utilizzare le chiavi private che deve già decifrare automaticamente la connessione e presentare il codice all'agente utente.

Spero che questo aiuti!

+0

Ho chiarito che non ho bisogno di SSL qui. So come crittografare la connessione stessa. Sto cercando le funzionalità di privacy della crittografia a chiave pubblica, ma in un browser web piuttosto che in gpg .. – ftrotter

2

Ora che ho capito quello che stai dicendo, posso darvi una risposta ferma :)

Il meglio che posso dirvi è che non si può ottenere la crittografia decente nel modo in cui si sta cercando di fallo. La crittografia a chiave privata (in particolare RSA) utilizza numeri molto, molto, molto grandi per eseguire la crittografia. Usare numeri piccoli è molto semplice da decifrare computazionalmente (ci sono solo tanti numeri primi) ei numeri diventano straordinariamente veloci. Fondamentalmente, con RSA, devi prendere grandi numeri e aumentarli a grandi esponenti. JavaScript è in grado di supportare numeri piuttosto grandi, ma tu colpirai un muro con le prestazioni. Con una chiave a 512 bit, la crittografia di alcuni kilobyte può richiedere fino a pochi secondi, mentre la decrittografia può richiedere da pochi secondi a pochi minuti. Il motivo per cui JS è così lento è semplicemente perché non è un linguaggio compilato.Certo, potresti ridurre la dimensione della chiave, ma qualcosa di più grande di un paio di kilobyte e hai un problema.

Inoltre, RSA è intrinsecamente insicuro in una pagina Web perché la chiave privata viene trasmessa insieme ai dati da decrittografare (a meno che non sia stata trasferita in precedenza), consentendo a chiunque riceva la pagina di decodificare i dati.

Presumo che tu stia cercando di farlo perché vuoi offuscare del codice dal tuo utente o da un client, quindi ti suggerirò di controllare la crittografia XOR. Certo, non è neanche lontanamente sicuro come RSA, ma usa principi che possono essere molto sicuri se usati correttamente. Ad esempio, se si utilizza una chiave casuale che viene utilizzata una sola volta e ha la stessa lunghezza dei dati/codice (un blocco temporaneo), la crittografia è "noncrassibile". Ancora meglio, la crittografia XOR è VELOCE. Ecco alcune risorse:

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

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

Spero che tu abbia fortuna con quello che stai cercando di fare!

+0

Questo è un punto molto interessante, e l'ho modificato, perché è così utile ... Ancora non lo fa indirizzo la mia domanda. È tollerabile che la mia applicazione impieghi molto tempo per decodificare le cose, poiché questa sarà solo una funzione di amministratore. Aggiungerò altro testo che descrive "perché" voglio farlo ... – ftrotter

1

Sto cercando esattamente la stessa cosa che fai e volevo usare anche le funzioni di openssl di php. Sono stato contento di vedere che sul phpside tutto funzionava alla perfezione con la chiave privata/pubblica (criptare/decrittografare) e ora volevo trovare un modo per usare privatekey sul client come si fa.

!!!

SE troverete tutto per favore fatemelo sapere via email:

PKI (at) life.de

!!!

E per l'aspetto prestazionale: Si crittografa le parti grandi con la crittografia simmetrica e solo la chiave di decrittazione con la chiave pubblica del client per esagerare. Quindi non è necessario crittografare molti kb.

Ma sembra essere un vicolo cieco con Firefox, ma con IE e ActiveX sembra possibile con CAPICOM (Non avevo ancora letto molto su di esso ora). hxxp: //geekswithblogs.net/shahed/archive/2007/05/03/112232.aspx

Ma per JavaScript/PHP dare un'occhiata (e leggere tutti i commenti alle FAQ e anche ad altre pagine!) In futuro forse la comunicazione bidirezionale è stato menzionato): hxxp: //www.jcryption.org/

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

Criptazione Pure Javascript Public/Privatekey hxxp: //shop-js.sourceforge.net/crypto2.htm

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

PHP con OpenSSL sul Serverside/.NET sul lato client hxxp: //www.csharpbydesign.com/2008/04/asymmetric-key-encryption-with.html

Javascript OpenPGP

hxxp : //www.hanewin.net/cifrare/

PS: stupido meccanismo mi impedisce la pubblicazione di link ...

3

E 'stato un po' che lei ha chiesto questa domanda, ma se tu o chiunque altro è alla ricerca di una possibile soluzione a questo problema o una uno simile, si dovrebbe verificare il progetto JavaScript Forge:

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

Questo progetto ha un'implementazione SSL in JavaScript che vi permetterà di includere un certificato sul lato client quando si comunica con Apache. Puoi anche eseguire manualmente la decifratura RSA utilizzando la chiave privata associata (a cui hai accesso in JavaScript).

Ad esempio, JavaScript può ottenere/inviare al server e includere il relativo certificato sul lato client. Apache può leggere questo certificato, utilizzare la chiave pubblica per crittografare tutti i dati appropriati e quindi restituire tali dati al client. Il client potrebbe quindi utilizzare la sua chiave privata (in JavaScript) e decodificare le informazioni e fare qualcosa con esso. Questa crittografia aggiuntiva probabilmente non è nemmeno necessaria, tuttavia, se il tuo server può autenticare il certificato sul lato client come il destinatario appropriato del segreto che stai cercando di passare.

Il progetto Forge ha anche le API per creare un sistema per l'importazione/esportazione di chiavi e certificati da/per Firefox o altri browser (se questo è ancora un requisito per qualche motivo). Un piccolo aiuto da openssl potrebbe essere necessario per ottenere le chiavi/certs nel formato corretto per l'importazione/esportazione (pem => pkcs12), ma un esempio di come alcuni di questi lavori possono essere trovati in una dimostrazione di WebID basata su JavaScript. WebID è un sistema di autenticazione basata su certificati lato client:

gestione WebID demo: https://webid.digitalbazaar.com/manage/

autenticazione WebID demo: https://payswarm.com/webid-demo/

Nota che i certificati SSL per i siti di cui sopra sono auto-firmato e richiederà eccezioni temporanee da aggiungere al tuo browser per vederle. I siti non richiedono l'inserimento di alcuna informazione personale, sono solo a scopo dimostrativo. Tuttavia, se si accede al primo collegamento, è possibile generare chiavi nel browser (utilizza Forge JavaScript per eseguire questa operazione) e quindi è possibile visualizzare la chiave privata e il certificato generati, in formato PEM, nell'elenco in alto della pagina. La chiave e il certificato vengono mantenuti tramite la memoria locale Flash.

Quasi 100% (se non quello) dell'origine per il sito di gestione WebID è visualizzabile poiché è principalmente JavaScript. Inoltre, il progetto stesso di Forge (vedi il link github) è opensource.