Integriteit
Hoe toon je aan dat de dataset die je afgeeft dezelfde is als die je maanden later terugkrijgt?
Versleuteling is geen integriteit
BitLocker beschermt tegen meelezen, niet tegen wijzigen. Wie de sleutel heeft, kan de inhoud aanpassen en de drager netjes weer afsluiten. Er staat dan nog steeds een versleuteld volume, alleen met andere data erin.
Schrijf dus nooit in een verslag dat een drager “beveiligd is tegen manipulatie” omdat ze versleuteld is. Dat is een uitspraak die bij het eerste kritische tegenlezen sneuvelt, en ze is ook niet nodig: daar is een checksum voor.
Wat een checksum wel doet
Een SHA-256-hash is een vaste waarde van 64 hexadecimale tekens die uit de inhoud van een bestand volgt. Eén gewijzigd, toegevoegd of verwijderd bericht levert een andere waarde op. Die komt dan niet meer overeen met de referentiewaarde, en dat is narekenbaar door iedereen die het bestand en de waarde heeft. Je hoeft er zelf niet bij te zijn en niemand hoeft je op je woord te geloven.
Wat een checksum niet doet: hij zegt niets over wat er had moeten staan. Een bestand dat stilletjes verdwijnt, laat geen afwijkende hash achter, want er is niets meer om te hashen. Daarom hoort er naast de hashwaarden ook een inventaris op de drager te staan.
De constructie die het bindend maakt
Een CHECKSUMS_SHA256.txt op de drager alleen bewijst niets. Wie de bestanden kan wijzigen, kan dat tekstbestand mee wijzigen, en dan klopt alles weer.
De referentiewaarden moeten dus buiten het bereik liggen van wie aan de drager kan komen. Neem ze op in het verslag dat je digitaal ondertekent. Daarmee hangt elke hashwaarde aan je handtekening en aan het tijdstip van ondertekening, en ligt vast wat de inhoud was op het moment dat je ze afgaf.
Wat er op elke drager staat
- de databestanden zelf;
MANIFEST.txtmet de inhoud en de afbakening van de dataset: wat zit erin, wat bewust niet, en waarom;CHECKSUMS_SHA256.txtmet één hashwaarde per bestand.
Neem in het verslag ook de hash van MANIFEST.txt zelf op. Zonder dat is de beschrijving van de dataset het enige deel dat achteraf ongemerkt bijgesteld kan worden, en dat is net het deel waar de afbakening in staat.
Rekenen
Eén bestand, met de PowerShell die op elke Windows-machine staat:
Get-FileHash -Algorithm SHA256 -LiteralPath .\bestand.pst
De hele boom in één keer, weggeschreven naar een CHECKSUMS_SHA256.txt één niveau boven de datamap:
Get-ChildItem -Recurse -File |
Get-FileHash -Algorithm SHA256 |
ForEach-Object { '{0} *{1}' -f $_.Hash, (Resolve-Path -LiteralPath $_.Path -Relative) } |
Set-Content -Encoding utf8 ..\CHECKSUMS_SHA256.txt
Voor wie liever klikt is er fHash: gratis, open source, voor Windows en macOS, met een item in het rechtermuisknopmenu van de Verkenner. Het rekent MD5, SHA-1, SHA-256 en SHA-512. Vermeld die tool in je verslag, of een gelijkwaardige. Een partij die één bestand wil natrekken moet dat kunnen zonder eerst een commandoregel te leren.
Narekenen
Geef ook mee hoe de controle gebeurt. Uitgevoerd vanuit de datamap:
$fouten = 0
Get-Content ..\CHECKSUMS_SHA256.txt -Encoding utf8 | Where-Object { $_ } | ForEach-Object {
$verwacht, $pad = $_ -split ' \*', 2
if (-not (Test-Path -LiteralPath $pad)) { $fouten++; "ONTBREEKT: $pad"; return }
if ((Get-FileHash -Algorithm SHA256 -LiteralPath $pad).Hash -ne $verwacht) { $fouten++; "AFWIJKING: $pad" }
}
if ($fouten -eq 0) { 'Alle bestanden komen overeen.' } else { "$fouten afwijking(en) gevonden." }
Dit meldt zowel gewijzigde als ontbrekende bestanden. Wat het niet meldt is een bestand dat er is bijgekomen en dat in de lijst ontbreekt. Daarvoor blijft MANIFEST.txt nodig, en de vaststelling dat het aantal regels in de checksumlijst overeenkomt met het aantal bestanden op de drager.
Valkuilen
Hash bij ontvangst, niet pas bij aflevering. Een hashwaarde die pas op het einde ontstaat, dekt alleen het einde. Rekenen bij ontvangst legt de begintoestand vast en maakt elke latere bewerking zichtbaar als een bewuste stap in plaats van als een onverklaarbaar verschil.
Zet -Encoding utf8 op Set-Content. Windows PowerShell 5.1 schrijft standaard in de ANSI-codepagina van het systeem. Een bestand met een accent of een Cyrillisch teken in de naam komt dan corrupt in de lijst en is achteraf niet meer terug te vinden. In een dossier met e-mailbijlagen gebeurt dat op de eerste de beste bijlage.
-Path slaat bestanden met rechte haken in de naam stilzwijgend over. Namen uit mailboxen bevatten die geregeld. PowerShell leest de haken als jokertekens, vindt niets, en meldt niets. Gebruik overal -LiteralPath, anders vallen precies de bestanden met de lastigste namen buiten de controle.
Schrijf de checksumlijst niet in de map die je aan het hashen bent. Anders neemt het bestand zichzelf half geschreven op, of ontbreekt het net. Schrijf een niveau hoger en verplaats het achteraf.
Plan een controle op de doorvoer van de drager. Het hashen zelf kost weinig: 2 GB uit de bestandscache is een kwestie van enkele seconden, in de orde van tientallen GB per minuut. Zodra je van een externe schijf of een netwerkshare leest, bepaalt die verbinding hoe lang je zit te wachten. Een volle schijf natrekken duurt dus ongeveer even lang als ze uitlezen.
Achteraf opruimen
Verwijder de lokale werkkopie zodra de dragers klaar en gecontroleerd zijn, zeker wanneer het vonnis bepaalt wie de data in bewaring mag houden. Noteer in het verslag dát je het gedaan hebt en wanneer.
Het ondertekende verslag met de hashwaarden blijft wel bestaan, en daarmee kan jaren later nog vastgesteld worden of de drager die op tafel komt dezelfde inhoud draagt.