La risposta breve è che non è possibile fare affidamento sulla crittografia per garantire l'integrità di un messaggio. Vedi qui ad esempio.
Per dimostrare perché questa affermazione generale è valida anche per l'esempio specifico di questa domanda, vediamo come un utente malintenzionato può modificare un messaggio crittografato. Per semplicità, suppongo che tu stia utilizzando la crittografia AES-CBC. Consideriamo la seguente stringa:
{"Name":"Ryan Archer","Crime":"First Degree Murder","Judge 1":"Afred E
Newman Jr","Verdict":"Not Guilty"}
Quando un AES-CBC codifica la stringa precedente, verrà crittografato nei seguenti blocchi da 16 byte:
Block 0: "Name":"Ryan Arc
Block 1: her","Crime":"Fi
Block 2: rst Degree Murde
Block 3: r","Judge 1":"Al
Block 4: fred E Newman Jr
Block 5: ","Verdict":"Not
Block 6: Guilty"
E ogni blocco della stringa crittografata corrisponderà allo stesso blocco della stringa di testo in chiaro originale.
Ora ecco una caratteristica interessante di CBC. Anche se non conosci la chiave di crittografia, puoi modificare il testo crittografato in modo tale che, una volta decodificato, il testo in chiaro venga modificato in un modo specifico.
Facciamo l'esempio sopra. Se qualcuno fosse in grado di crittografare AES-CBC con una certa chiave e non conosco questa chiave, se io XOR gli ultimi 3 byte del blocco 4 del testo cifrato con la stringa "Not", l'impatto sul testo decrittato sarebbe essere come segue:
- Il blocco 4 verrebbe danneggiato in un modo casuale sconosciuto.
- Gli ultimi 3 byte del blocco 5 sarebbero XORed con la stringa "Not"
Quindi, dopo la decrittazione, la stringa dovrebbe essere la seguente:
Block 0: "Name":"Ryan Arc
Block 1: her","Crime":"Fi
Block 2: rst Degree Murde
Block 3: r","Judge 1":"Al
Block 4: %$#$%@#%$@#%#%#$ (random garbage bytes)
Block 5: ","Verdict":"
Block 6: Guilty"
E verrebbe letto come la seguente stringa json valida.
"Name":"Ryan Archer","Crime":"First Degree Murder","Judge 1":"Al%$#$%@#%$@#%#%#$","Verdict":" Guilty"
Il nome del giudice è corrotto casualmente, ma l'attaccante ha modificato con successo una porzione critica del messaggio - Ryan Archer è ora colpevole di omicidio!
Naturalmente non tutte le stringhe sono strutturate in questo modo ed è possibile che i byte casuali nel blocco 4 corrompano la stringa in modo che non sia più una stringa json valida. Ma un utente malintenzionato può provare questo attacco più volte con varie modifiche della stringa crittografata e prima o poi otterrà una stringa JSON valida.