2011-12-18 27 views
9

Sto cercando un algoritmo di crittografia a chiave simmetrica sicura compatibile con JavaScript e Java.Algoritmo di crittografia a chiave simmetrica

Ho provato a implementarne uno ma ho avuto alcuni problemi di codifica.

+2

Cosa intendi con "compatibile"? – hellectronic

+0

Quindi posso crittografare con JavaScript e decifrare con Java e viceversa senza problemi di codifica. –

+2

Mi piacerebbe raccomandarti di leggere [Il minimo assoluto Ogni sviluppatore di software deve assolutamente conoscere positivamente Unicode e Set di caratteri (nessuna scusa!)] (Http://www.joelonsoftware.com/articles/Unicode.html) – hellectronic

risposta

32

Non si desidera crittografare con JavaScript, especially on the client-side where it is open to tampering e non dispone di cryptographically secure random number generator.

Ho provato attuare uno, ma ho avuto alcuni problemi di codifica.

Hai provato a scrivere la tua crittografia personale? Sei andato contro tutto ciò che il mondo della sicurezza tiene caro. No. tutorial reali che spiegano come funziona la crittografia sono così paura che la gente sta andando a rovinare tutto, perché non capiscono la matematica dietro di esso, in realtà ho visto questo in uno di essi:

enter image description here

Se non si capisce la crittografia, cose come, in realtà "generatore di numeri pseudo casuali crittograficamente sicuro" e attacchi comuni su di esso, non si dovrebbe farlo.

Se non capisci cose come gli attacchi di canale laterale, non dovresti farlo.

Se non si capisce cosa sta succedendo in crypto e letto su-almeno due libri su di esso si ha nessun business attuazione.

Crypto non è una scatola nera magica, è qualcosa che è MOLTO facile da rovinare, anche senza toccare alcun bit di codice in una soluzione pacchettizzata.

Cosa deve fare? Dimentica la crittografia JS. Lo so, l'ho provato io stesso. È una perdita di tempo. Impara dai miei errori.

Ottenere un certificato SSL, SSL è il modo migliore per noi di crittografare i messaggi a livello di trasporto da un server a un client. È più sicuro che puoi ottenere. Se ti trovi ad affrontare un avversario che può sconfiggere SSL, credimi, anche la tua crittografia basata su JS è compromessa.

Una volta sul server in cui è protetto da manomissioni, crittografarlo. Tutto il resto è davvero un lungo cammino per perdere tempo.

Inoltre, andate a leggere questi libri:

This one is free This one is cash money

Poi quando si capisce di loro tornano e urlare contro di me sul perché mi sbaglio e non capiscono quanto è necessario JS su il cliente a fare cripto.

3

v'è un eccellente DES (e per estensione 3DES) implementazione in JS, che io uso molto spesso. Metterò il link lunedì, quando sarò in ufficio e lo preparerò. I risultati di questo (dopo la codifica base64 per il trasporto) funzionano perfettamente con .Net/Mono (incorporato), Java (bulitin) e PHP (mcrypt).

Trovato i collegamenti, ma entrambi sono morti: http://www.shopable.co.uk/des.html e http://www.netdealing.com. L'ho messo su http://pastebin.com/KbRsWKJY

+1

Mhh all'università mi hanno insegnato che DES ora è facilmente decifrabile ... AES dovrebbe essere ok, ma non credo che javascript possa gestire una cosa del genere. –

+2

DES è facilmente decifrabile a causa di attacchi di forza bruta, ma DESede non è facilmente decifrabile. AES è un'implementazione * più veloce * di DESede, quindi se JavaScript può gestire DESede, può certamente gestire AES-128. Utilizza DESede solo per implementazioni legacy (o, se non riesci a trovare un'altra libreria e capisci i pochi punti deboli come le dimensioni di un blocco piccolo, i tasti deboli, i bit di parità nelle chiavi, ecc.). –

+1

Mi permetta di chiarire: puntare al codice JS non significa, che abbraccio acriticamente l'uso non riflesso del (3) DES sul lato client. Ma considero un fatto, che l'uso della crittografia JS può essere uno strato significativo in difesa. Quindi lo uso, dove penso abbia senso. –

1

This page ha la modalità CTR, che è disponibile in Java. Vorrei raccomandare chiavi da 128 bit o potresti avere problemi con le politiche di esportazione Java su chiavi di dimensioni maggiori.

Here è una pagina che utilizza alcuni metodi di crittografia molto utili, tra cui le tecniche di crittografia delle password e le crittografie con controlli di integrità e autenticazione, anche se potrebbero essere necessarie le librerie rimbalzanti del castello su Java per abbinarle a tutte.

ci sono una gran quantità di librerie per JavaScript, ma i problemi di codifica dei caratteri sarà presente su uno di essi. Quindi assicurati di utilizzare la stessa codifica sia sul lato JavaScript che sul lato Java. Una rapida occhiata mi assicura che JavaScript usa UTF-16 internamente, ma non impiccarmi su quello.

Infine, non provateci a casa, le librerie sono lì, li usano (specialmente se fanno menzione i test e/o vettori ufficiali di prova).

+0

Dove posso trovare l'implementazione Java di AES che usa Bouncy Caste? –

+0

Le librerie Bouncy Castle implementano un fornitore JCE/JCA. Quindi la maggior parte delle funzionalità viene aggiunta all'API Crypto di Java stesso. Puoi accedere all'implementazione rimbalzante utilizzando ad es. Cipher.getInstance ("algo/mode/padding", "BC"); ma solo * dopo * hai aggiunto il provider alla classe Security. È anche possibile accedere direttamente all'implementazione di livello inferiore delle funzioni di sicurezza direttamente. –

+0

Ci sono due esempi compatibili? JavaScript: http://www.movable-type.co.uk/scripts/aes.html; Java: http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html –

0

Come le altre risposte, se non si deve crittografare con JavaScript, evitarlo. Tuttavia, ci sono alcuni casi d'uso validi per la crittografia in JavaScript.

Quando è necessario, consiglio questa libreria: https://keybase.io/triplesec/.

È più sicuro di DES, a cui un'altra risposta si collega.

Problemi correlati