2012-11-22 7 views
7

Qual è il modo più semplice (in termini di risorse di calcolo) per stabilire se un messaggio di posta elettronica s/mime è firmato con firma allegata quando questo messaggio è crittografato ?Come verificare se anche il messaggio S/MIME crittografato è firmato, senza decrittografarlo

Se un messaggio è appena firmato, è facile. Ha un po 'come:

alla firma allegata

Content-Type: application/x-pkcs7-mime; smime-type=signed-data; 
    name="smime.p7m" 

Oppure:

alla firma distaccata

Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; 
    micalg=SHA1; boundary="----=_NextPart_000_00D2_01CD5850.61030BF0" 

nelle sue intestazioni.

Ma quando un messaggio è crittografato, non si può dire se è firmato anche perché l'intestazione Content-Type è lo stesso per entrambi i casi (solo cifrati e cifrati/firmati):

Content-Type: application/x-pkcs7-mime; 
    smime-type=enveloped-data; 
    boundary="----=_NextPart_000_000D_01CDC82B.98454D80"; 
    name="smime.p7m" 

lo fa significa che devo decifrare il messaggio solo per sapere se è anche firmato? Per ora, sembra che non possa nemmeno dire se il mio messaggio è stato firmato prima di decifrarlo (perché la firma è all'interno dei dati crittografati). O, forse, i dati crittografati e firmati S/MIME hanno ancora qualche schema che potrebbe permettermi di distinguere tra dati crittografati/firmati e crittografati/non firmati senza decrittografia (che potrebbe anche essere possibile se non ho il certificato per la decrittografia)?

+0

Se l'utente ha firmato, quindi ha crittografato i dati, probabilmente voleva nascondere il fatto che il messaggio è stato firmato, il che è contrario a ciò che si vuole fare. –

+0

Io non la penso così. Alcuni client di posta elettronica funzionano in questo modo. – Alex

+0

Se un messaggio è crittografato _dopo_ è stato firmato, l'unico modo per sapere che è stato firmato è di decodificarlo prima. Vedi la mia [risposta] (http://stackoverflow.com/a/13516241/29157) per capire perché questa è una cattiva idea. –

risposta

7

S/MIME è flessibile; puoi firmare e/o criptare in qualsiasi combinazione tu voglia. I client di posta elettronica, tuttavia, in genere si comportano tutti allo stesso modo: Outlook 2010, Apple Mail e Thunderbird 17 firmano e quindi crittografano. I risultati per questi 3 sono quasi identici. Essi comprendono questi 3 intestazioni nelle intestazioni dei messaggi:

Content-Type: application/pkcs7-mime; smime-type=enveloped-data; 
    name="smime.p7m" 
Content-Disposition: attachment; filename="smime.p7m" 
Content-Transfer-Encoding: base64 

Essi cifrare e Base64-codificare l'intero corpo del messaggio.

per rispondere alle vostre domande:

Qual è il modo più semplice (in termini di risorse di calcolo) per dire se un messaggio di e-mail s/MIME è firmato con firma allegato quando questo messaggio è criptato?

L'unico modo è decrittografarlo.

Significa che devo decodificare il messaggio solo per dire se è anche firmato ?

Sì.

3

Normalmente il messaggio viene prima crittografato, quindi firmato, quindi dovrebbe essere facilmente visibile nella busta CMS codificata ASN.1 DER. Vedere il CMS RFC pubblico per ulteriori informazioni.

+1

Ma devo occuparmi di e-mail che ricevo, e alcuni di loro hanno la firma all'interno dei dati crittografati. Non penso che questo fosse l'obiettivo dell'autore del messaggio, è solo il modo in cui funziona un client di posta elettronica. – Alex

+0

È possibile eseguire la crittografia dopo la creazione della firma poiché la busta della firma si troverà completamente all'interno della busta di crittografia. Non penso che ci sia un modo per controllare se il messaggio è probabile che sia firmato, a meno che non venga comunicato "fuori banda". –

+0

Grazie per la risposta. Sospettavo lo stesso, volevo solo ottenere conferma da altri esperti. – Alex

6

Se l'obiettivo è quello di garantire che:

  1. Solo il destinatario può decifrare il messaggio, e
  2. Il destinatario sa chi ha scritto il messaggio,

allora la sequenza corretta è quella di firma, encrypt e quindi firmare nuovamente. Altrimenti non ci si può fidare comunque. Ecco perché.

Messaggio firmato e crittografato:il mittente prima firma il messaggio, quindi lo crittografa.
Qui il destinatario può decodificare il messaggio, quindi ricodificarlo con la firma intatta e inviarlo a una terza parte (con intestazioni di spoofing). Quella terza parte crederà che l'autore originale abbia inviato il messaggio direttamente a lui, quando è stato effettivamente inoltrato dal destinatario originale.

Messaggio crittografato e firmato:il mittente prima crittografa il messaggio, quindi lo firma.
Qualsiasi utente malintenzionato può rimuovere la firma, sostituirla con la propria e rivendicare la paternità del messaggio senza conoscerne il contenuto.

Messaggio crittografato, firmato e crittografato:il mittente crittografa e firma il messaggio, quindi lo crittografa nuovamente.
Qui, la crittografia interna garantisce che solo il destinatario previsto possa leggere il messaggio. La firma significa che l'autore è a conoscenza del contenuto e lo intende per il destinatario. La crittografia esterna impedisce a un utente malintenzionato di conoscere o alterare il messaggio.

  • In questo caso, il destinatario non saprà che il messaggio è firmato fino a dopo la sua decrittografia.

  • Criptare un messaggio due volte è più

  • Peggio ancora, crittografare-poi-sign è known di essere vulnerabile agli attacchi.

firmato, crittografato e messaggio firmato:le indicazioni del mittente e crittografa il messaggio e poi quelle di nuovo.
Qui, la firma interna significa che l'autore è a conoscenza del contenuto. La crittografia garantisce che solo il destinatario possa decrittografarlo. E la firma esterna significa che l'autore ha inteso il messaggio per il destinatario.

  • Se un utente malintenzionato tenta di rivendicare la proprietà, eliminando la firma esterna e la sua sostituzione con la propria, allora la (sostituito) firma esterno sarà non corrisponde alla firma interna.

  • Se il destinatario decodifica e inoltra il messaggio a terzi, deve lasciare intatta la firma più interna o sostituirla con la propria. In entrambi i casi, l'autore originale è assolto dalla responsabilità per il messaggio.

Conclusione

Nonostante gli standard attuali (rotti), è possibile verificare il mittente di un messaggio solo se è stato firmato nella fase finale. Quindi non devi preoccuparti di un messaggio che è stato firmato per primo e quindi crittografato, perché non ti puoi fidare che il presunto firmatario ti abbia inviato il messaggio.

Ad esempio, immagina di ricevere un messaggio firmato e crittografato dal Presidente, che ti invita a cena alla Casa Bianca. Il presidente, infatti, ha scritto quel messaggio, ma in realtà lo ha inviato a qualcuno che ha deciso di fare una battuta su di te.

+3

-1 come si fa un grande sforzo per spiegare la sicurezza dei messaggi firmati/criptati, ma si è dimenticato di provare effettivamente a rispondere alla domanda. –

+3

@Owlstead: in primo luogo, grazie per aver dedicato del tempo (e avere la cortesia) a spiegare il tuo downvote. Una delle lezioni che apprendi dall'esperienza, come dicevo al mio supporto del supporto tecnico, non è di concentrarsi sul dare al cliente ciò che vuole; invece, dagli ciò che ha bisogno. Spiegando perché è fuorviante fidarsi della firma su un messaggio che è stato crittografato _dopo_ è stato firmato, ho risposto alla domanda di fondo. L'OP ha chiesto "come posso ...?" La risposta corretta è "Non farlo, ed ecco perché". –

+0

C'è molto errore nello schema, ma protegge anche da molti attacchi. Dipende dal caso d'uso. Per esempio. se accetti solo messaggi di determinate entità, non ti importa se qualcuno afferma che è il suo messaggio. –