Skip to content

Leggere un registro delle modifiche concatenato con hash, e verificarlo da soli

Un registro concatenato vale quanto una seconda persona può verificare da sola. Cosa contiene una riga, cosa prova la catena da sé, e cosa lascia ad altri controlli. Poi come un auditor riverifica un export con i propri strumenti.

Aggiornato · 7 min di lettura

Cosa contiene una riga

Un registro delle modifiche si guadagna il nome essendo leggibile da qualcuno che non era nella stanza. Ogni modifica governata scrive una riga. La riga è deliberatamente noiosa.

Quando, e chi
Una marca temporale. L’indirizzo e-mail della persona che ha agito. Il ruolo che aveva in quel momento. Il ruolo viene scritto al momento, non cercato dopo. I ruoli cambiano, e questo record riguarda il giorno in cui è successo.
Dove, e cosa
La superficie su cui è stata fatta la modifica. L’azione compiuta. L’obiettivo su cui ha agito. Il livello semantico, il relay, le chiavi dei fornitori, le esecuzioni di script e la console di amministrazione scrivono tutti qui.
Lo stato, come hash
Un hash del contenuto dello stato prima, e uno dello stato dopo. I valori stessi restano fuori dal registro. Un record di un cambio di credenziali può esistere senza che la credenziale sia da nessuna parte nelle vicinanze.
Il collegamento
L’hash della voce precedente, e l’hash di questa stessa voce. Quei due campi sono la catena.
Dettagli
Un piccolo dizionario di contesto. Passa per lo stesso filtro che usa la traccia di audit dell’operatore. Le chiavi a forma di segreto vengono rimosse prima che qualcosa raggiunga il file.

Sta accanto alla traccia di audit dell’operatore invece di sostituirla. Due registri, due lettori. La traccia di audit è la cronologia della console che un amministratore scorre durante la settimana. Il registro è ciò che qualcuno legge un anno dopo, senza alcun ricordo di tutto questo.

Cosa prova la catena

Ogni hash di voce è un SHA-256 su due cose unite insieme. Primo, la forma canonica della voce con il proprio hash rimosso. Secondo, l’hash della voce precedente. Canonica significa le chiavi ordinate in un ordine fisso, senza spazi vaganti. La stessa voce si serializza allora sempre negli stessi byte. La prima voce si collega a sessantaquattro zeri.

Ciò che quella costruzione compra vale la pena dirlo con precisione. Altera un carattere di un campo registrato, cancella una riga, o scambia due righe. Ogni collegamento da quel punto in poi smette di corrispondere. La verifica percorre l’intero file. Riporta l’indice della prima riga sbagliata e la ragione. Quella ragione è una di tre: una riga malformata, un collegamento rotto, o un hash che non concorda con il proprio contenuto.

Nominare la prima riga sbagliata è la maggior parte del valore. Qualcosa non va da qualche parte in cinquantamila righe è un allarme. Riga 8.214, hash non corrispondente, è un punto da cui partire. Delimita anche la domanda, perché tutto ciò che viene prima ha superato la verifica.

La funzione è SHA-256 semplice senza chiave segreta. È uno scambio deliberato. Una costruzione con chiave proverebbe che il record proviene da noi. Una senza chiave permette a chiunque abbia l’export di verificarlo con trenta righe di script proprio. Per un auditor, quella è di gran lunga la proprietà più utile.

Domande per altri controlli

Una catena risponde bene a una domanda, e a diverse altre per niente. Sapere quale sia quale conta. Impedisce che ci si fidi di un controllo per un lavoro che non stava facendo.

  • Se una modifica è stata registrata del tutto. Una catena non dice nulla di una voce che non è mai stata scritta. Le scritture sono serializzate e in sola aggiunta. Una scrittura che fallisce lo registra a voce alta nei log e non restituisce nulla, senza interrompere l’azione dell’amministratore. È lo scambio giusto per una console in uso. Significa però che la completezza poggia sul percorso di scrittura, non sulla catena. Chiedi cosa succede quando una scrittura fallisce, e come lo scopriresti.
  • Cosa fosse davvero la modifica. Prima e dopo sono hash del contenuto. Il registro conferma che lo stato è cambiato, e che corrisponde a uno stato che già possiedi. Rileggere un vecchio valore da un hash va oltre ciò che un hash può fare. È esattamente per questo che i segreti possono essere tenuti completamente fuori dal registro.
  • Se l’intero file è stato riscritto. Una catena senza chiave rileva una modifica parziale. Chiunque sia in grado di riscrivere ogni riga potrebbe ricalcolare ogni collegamento. Ciò che risponde a questo è il percorso di scrittura in sola aggiunta e i permessi del file. Soprattutto, sono le copie già in mano a qualcun altro.
  • Se la catena è ripartita. Se la coda non può essere letta all’avvio, l’aggiunta prosegue dal collegamento di genesi. La verifica segnala la giuntura e non la liscia mai. Un collegamento rotto a un confine di riavvio di solito ha una spiegazione noiosa. Merita comunque la domanda.

Un fornitore che risponde a tutte e quattro di buon grado è più utile di uno che dice che la catena le copre.

Riverificare un export da soli

L’export arriva come JSON o CSV, preso dalla console del registro. Porta i filtri che erano applicati. Per la verifica, prendi il JSON. Il CSV appiattisce la colonna dei dettagli perché una persona possa leggerla, e l’hash è stato calcolato su una forma diversa.

  1. Parti con un hash precedente di sessantaquattro zeri.
  2. Per ogni riga in ordine, copia l’oggetto e rimuovi il suo campo hash di voce.
  3. Serializza ciò che resta come JSON. Ordina le chiavi, non lasciare spazi tra i token, ed esegui l’escape dei caratteri non ASCII.
  4. Aggiungi l’hash precedente a quel testo. Codifica il risultato come UTF-8. Prendi il digest SHA-256 in esadecimale minuscolo.
  5. Confrontalo con l’hash di voce registrato. Confronta l’hash precedente registrato della riga con quello che hai portato con te. Poi porta avanti l’hash di questa riga.
  6. Fermati alla prima riga in cui uno dei due confronti fallisce. Registra il suo indice, e quale confronto è fallito.

Un ricalcolo che non concorda su ogni riga di solito indica il serializzatore, non il registro. Questo include la primissima riga. L’ordine delle chiavi, gli spazi e l’escape unicode cambiano ciascuno i byte sottoposti a hash. Sbagliarne uno dà una risposta uniforme, sicura e completamente sbagliata.

Conserva lo script. Una verifica che puoi rieseguire a richiesta è un controllo. Una verifica che qualcuno ha eseguito una volta, in una riunione, è un aneddoto.

Perché l’export viaggia più lontano

La console mostra un badge di verifica, calcolato sull’intero file a ogni caricamento di pagina. Una rottura emerge la prossima volta che qualcuno guarda. È anche, inevitabilmente, chi scrive che riferisce su se stesso.

Lo schermo è anche una vista nel senso ordinario. È filtrato per superficie, per attore e per intervallo di date. È ordinato dal più recente e limitato a un numero di righe praticabile. L’export applica gli stessi filtri con un limite molto più ampio. Prima di trarre una conclusione da un conteggio, sappi quale dei due stai leggendo.

Un export può lasciare l’edificio, uno schermo no. Un export preso oggi e tenuto dal tuo auditor fissa la catena a oggi. Qualsiasi disaccordo successivo tra la sua copia e la tua emerge in un semplice confronto. Non chiede fiducia a nessuna delle due parti. Quella è la proprietà intorno a cui vale la pena progettare l’intera routine.

Un export acquista valore con l’età e con la distanza. Una copia, nelle tue mani, sulla stessa macchina, è un backup. Una serie di copie è una prova. Prendile a calendario, e tienile dove il prodotto non ha accesso in scrittura.

Una routine che puoi ripetere

  1. Alla fine di ogni periodo, esporta l’intero intervallo come JSON. Non applicare filtri.
  2. Verificalo con il tuo script, e tieni insieme l’export e lo script.
  3. Confronta il nuovo export con quello precedente. Ogni riga che condividono dovrebbe essere identica, carattere per carattere. È questa la verifica che coglie una riscrittura, che la catena da sola lascia aperta.
  4. Controlla a campione una manciata di righe contro modifiche che qualcuno ricorda di aver fatto. Controlla l’attore e il ruolo registrati accanto.
  5. Conserva ogni export dove il prodotto non ha accesso in scrittura.
  6. Registra chi lo ha preso e quando, accanto al file, non in un sistema separato.

Il terzo passo trasforma un file coerente con se stesso in uno sottoposto ad audit. Costa un comando di confronto. Tutto il resto in questa pagina è preparazione per eseguirlo.