2011-11-28 11 views
8

Desidero sapere che le chiavi simmetriche possono essere utilizzate per firmare un messaggio? Possiamo encrpyt utilizzando la chiave segreta condivisa. Inoltre, quando viene utilizzata la chiave simmetrica per la firma, quale API può essere utilizzata in JAVA per caricare la chiave e firmare il messaggio?Utilizzo della chiave simmetrica (AES -128) per firmare e verificare un messaggio

se ho usato Signature da java.security, ha un api initSign ma che prende la chiave privata dalla coppia di chiavi pubblica/privata come argomento per firmare il messaggio. Qui la chiave è la chiave simmetrica.

Eventuali suggerimenti?

risposta

11

Una chiave segreta condivisa può essere utilizzata per calcolare uno Message Authentication Code (MAC), che può quindi essere utilizzato per confermare l'integrità e l'autenticità del messaggio a un'altra parte che conosce lo stesso segreto condiviso. A differenza delle firme digitali, che vengono create utilizzando la chiave privata e verificate tramite la chiave pubblica, i MAC non offrono non ripudio (chiunque possa verificare il MAC può anche generare un MAC per un altro messaggio).

Esistono diverse forme di codici di autenticazione dei messaggi; probabilmente la variazione più utilizzata è HMAC.

1

Se si desidera firmare un messaggio utilizzando una chiave simmetrica, si desidera utilizzare un CMAC basato su AES (o TDEA a 3 tasti o Cameilla). I CMAC sono i codici di autenticazione dei messaggi (MAC) costruiti sulla base dei codici a blocchi. In genere si utilizza un CMAC se si utilizza anche AES/3TDEA/Cameilla per la crittografia (ad esempio, è utile).

È inoltre possibile utilizzare un HMAC. Un HMAC è un Message Authentication Code (MAC) costruito sopra un hash. Dovresti usare un HMAC è un hash già presente nel programma (cioè, era comodo).

Quando nel programma sono presenti sia un codice di blocco che un hash, generalmente utilizzo un HMAC perché è più veloce.

Infine, per la completezza, non utilizzare MD5. È rotto (nonostante ciò che molti pensano nel mondo del software libero). SHA-1 non è più approvato per nuove applicazioni da enti come NIST, NESSIE e ECRYPT. Usa la famiglia di hash SHA-2, o usa Whirlpool.

Per il materiale specifico Java, vedere Java Cryptography Extensions.

6

Gli algoritmi simmetrici non possono dare la proprietà di non ripudio che gli schemi di firma asimmetrica danno, cioè il destinatario di un messaggio non può provare di non aver creato il messaggio da sé, poiché devono conoscere lo schema.

Detto questo, un message authentication code (MAC) può dare ciò che si vuole: Sia mittente e il destinatario hanno una chiave condivisa, il mittente calcola un Mac con il segreto e lo aggiunge al messaggio, e il ricevitore calcola la stesso MAC e lo confronta con il messaggio ricevuto.

Mentre il tipo MAC più utilizzato (HMAC) si basa sulle funzioni hash, ci sono anche quelli che si basano su un codice a blocchi come AES, come CBC-MAC (questo è come CBC, ma con lo zero vettore di inizializzazione e utilizzando solo l'ultimo blocco come output). (Come detto da Noloader, CBC-MAC non è il modo più sicuro per farlo, utilizzare altre modalità.)

È consigliabile utilizzare l'autenticazione dei messaggi nella maggior parte dei casi in cui si utilizza la crittografia, poiché molti schemi di crittografia sono vulnerabili a scelta- attacchi di testo normale.

In Java, un MAC può essere calcolato (e controllato) utilizzando la classe javax.crypto.Mac.

+1

CBC-MAC è danneggiato per messaggi di lunghezza variabile. Un CMAC è un CBC-MAC fatto bene. – jww

+0

Scusa ma non sono ancora chiaro. cosa determina la dimensione della chiave da utilizzare per HMAC? Capisco che posso usare HMAC su CMAC. Ma la chiave che ho è aes 128. Può essere usato? per esempio: chiave secretkey = new (chiave, "AES") SecretKeySpec – user839917

+0

Preferibilmente, si dovrebbe usare una chiave diversa (indipendente) per MAC e la crittografia, anche se è molto probabile HMAC diverso abbastanza in modo da utilizzare lo stesso tasto non darà problemi. È possibile utilizzare qualsiasi lunghezza della chiave desiderata per HMAC (fino alla lunghezza del blocco delle funzioni hash) (anche se non so se l'implementazione lo supporta), verrà semplicemente riempito con zero fino alla lunghezza del blocco della funzione hash. Le chiavi più grandi offrono maggiore sicurezza, sebbene non migliori le dimensioni dell'output delle funzioni hash (= dimensione MAC). –

Problemi correlati