Una risposta alla tua domanda dipende dal contesto del tuo problema e dall'attacco di cui sei preoccupato.
Qual è lo stesso per ogni soluzione è che è possibile utilizzare una catena di hash per collegare un nuovo file jpeg a una catena di file precedenti.
Se hai 3 file (a, b e c) e una funzione hash H, in pratica calcoli
head = H(a).
Quando arriva il prossimo file b
, fai
head = H(b | head)
e quindi per c
head = H(c | head)
Puoi quindi verificare che nessuno ha modificato i file jpg ricalcolando l'intera catena di hash e confrontandolo con la catena che hai già.
Il problema con questo è che un utente malintenzionato può manipolare o eliminare file a, boc e ricalcolare la catena di hash dal punto della prima manipolazione in poi.
La soluzione a questo dipende dalle circostanze.
Ti fidi dell'host che crea la catena di hash
Se l'host è protetto da manomissioni da parte di un utente malintenzionato, puoi fare come suggerito da schroeder e utilizzare la crittografia a chiave pubblica per firmare ogni nuovo hash con la tua chiave privata. Questo non diventa più intensivo dal punto di vista computazionale, più aumenta la catena. Calcoli solo un hash su un solo file jpg e l'ultimo hash. Dovrai includere la firma nel calcolo dell'hash della catena.
Nota che un utente malintenzionato che può manipolare sia i file jpg che la catena hash su un'altra macchina che vuole verificare la catena può comunque buttare via gli ultimi n file e i loro hash firmati, quindi se i tuoi file jpg non vengono creati regolarmente , sarà molto difficile rilevare un utente malintenzionato che rimuove semplicemente gli ultimi n file anche se aggiungi timestamp.
Non ti fidi dell'host che crea la catena di hash
Se non pensi che l'host sia sicuro dall'attacco, hai due opzioni:
Utilizza un servizio esterno attendibile per creare e firmare il prossimo hash con un nuovo hash del file jpg. Questo host terrà traccia dell'ultimo hash nella catena e lo fornirà a chiunque desideri verificare la catena, in modo che l'attacco di accorciamento descritto nell'ultima sezione possa essere sventato.
o
Aggiungi una prova di lavoro in modo che l'host debba dedicare una notevole quantità di tempo a calcolare il prossimo hash valido. Bitcoin fa ciò richiedendo l'hash di ogni nuovo blocco per iniziare con un certo numero di 0 (è un po 'più complicato, ma ottieni l'immagine), quindi per trovare un blocco valido, devi giocare con alcuni campi regolabili nell'intestazione del blocco finché non si finisce con un hash valido. Puoi adattarlo anche al tuo problema.
L'idea qui è che se un utente malintenzionato voleva cambiare la catena degli hash, avrebbe bisogno di duplicare la quantità di lavoro necessaria per crearlo. Ciò diventa più difficile quando si tenta di tentare la parte posteriore della catena. Dato che sembra che tu stia correndo su un Pi zero, la duplicazione del lavoro su un processore molto più veloce sembra facile, quindi la prova di lavoro probabilmente non funzionerà per te.
Anche se fosse fattibile, si rompe ancora di fronte all'attacco accorciamento. Non puoi davvero aggirare questo problema senza memorizzare la lunghezza della catena (o l'ultimo hash o qualsiasi altra cosa) in una posizione attendibile che l'autore dell'attacco non può modificare.
Utilizzo di una blockchain
Potresti anche usare una blockchain preesistente, come la blockcoin di bitcoin o ethereum. È possibile ottenere gli hash dei file nella blockchain di bitcoin, ad esempio creando una nuova transazione per ciascun nuovo file jpg e memorizzando l'hash del file come metadati della transazione.
Questo risolverebbe tutti i problemi, ma a seconda della velocità con cui avevi bisogno che le transazioni si incorporassero nella blockchain, ti costerebbe un sacco di soldi.