De meeste systemen ondertekenen het rapport. FahCel ondertekent elke meting en koppelt ze aan elkaar. Manipulatie van welke waarde dan ook, waar ook in de historie, wordt zo wiskundig aantoonbaar.
Verzegeling gebeurt bij ontvangst, dus het bewijs bestaat al voordat iemand erom vraagt. Voor een QA-manager verandert dat drie bekende haastklussen in zaken die gewoon klaarstaan.
Exporteer een ondertekende pdf met tijdstempel, de volledige meethistorie en het verificatieresultaat, ingericht voor toetsing aan de registraties waarop je al wordt beoordeeld.
EU GDP · 21 CFR Part 11 §11.10(e)Zodra een meting een grenswaarde overschrijdt, krijgt het team een melding. De registratie is dan al verzegeld in de keten, niet achteraf gereconstrueerd.
Verzegeld bij ontvangst · niet bij rapportageOverhandig de dataset en de open verificatietool. Een inspecteur kan de keten zelf offline opnieuw berekenen en tot hetzelfde resultaat komen.
Deterministisch · offline · opensourceEén hash toont of een meting is bewerkt, maar niet of er een is verwijderd, verplaatst of stilzwijgend toegevoegd. Twee hashes, één over de inhoud en één over de inhoud plus de vorige record_hash, maken elke vorm van manipulatie zichtbaar.
Een vingerafdruk van de inhoud van de meting, onafhankelijk van de plek in de keten. De exacte velden en canonisatieregel zijn bedrijfseigen, maar deterministisch: dezelfde meting levert altijd dezelfde hash op, op elk systeem, voor altijd.
De ketenschakel. Elke record_hash bevat de record_hash van de vorige meting. Zo vormen de hashes een eenrichtingsafhankelijkheid. De eerste meting gebruikt prev_hash = '0'.
Een gekoppelde lijst waarin elke schakel onafhankelijk te verifiëren is. Als meting #3 wordt gewijzigd, mislukken de controles voor #4 tot en met #N: hun opgeslagen record_hash komt niet meer overeen met de herberekende hash.
De verificatietool is deterministisch en identiek aan de code die de keten verzegelt. Dezelfde metingen geven altijd hetzelfde oordeel. Klanten en auditors draaien de volledige versie offline op elke geëxporteerde dataset. De kernregel voor verzegeling blijft bedrijfseigen.
// hashChain.js export function verifyChain(readings) { const sorted = [...readings].sort( (a, b) => a.device_timestamp - b.device_timestamp ); let prev_hash = sorted[0].prev_hash; // anchor ('0' at genesis) let firstTampered = null; for (const r of sorted) { core sealing — proprietary, redacted const data_hash = sha256(canon(██████████)); const record_hash = sha256(canon({ ████████ ┄ ████, prev_hash, ████████████ })); if (data_hash !== r.data_hash || prev_hash !== r.prev_hash || record_hash !== r.record_hash) { firstTampered ??= r.seq; // remember first failure } prev_hash = r.record_hash; // walk forward regardless } return { valid: firstTampered === null, first_tampered_at: firstTampered, total: sorted.length, }; }
De verificatietool doorloopt metingen in device_timestamp -volgorde, niet op ontvangstvolgorde. Een later ontvangen maar eerder vastgelegde meting komt op de juiste plek in de keten.
Voor elke meting berekent de verificatietool data_hash en record_hash opnieuw vanuit de opgeslagen velden met dezelfde canonisatieregels. De opgeslagen waarden worden niet vertrouwd, maar opnieuw berekend en vergeleken.
De eerste afwijking in een van de hashes wordt gemarkeerd. Elke volgende meting wordt verdacht: ook als de eigen hashes geldig lijken, is de integriteit van de keten al verloren.
valid, first_tampered_at, en het totale aantal gecontroleerde metingen. Dezelfde waarden staan in je audit-pdf. De inspecteur ziet dus precies wat je QA-team zag en kan het zelf herhalen.
Eén hash herkent een bewerkte meting, maar geen verwijderde, verplaatste of stilzwijgend toegevoegde meting. FahCel slaat er twee op: een data_hash over de inhoud van de meting en een record_hash over die inhoud plus de vorige record_hash. Samen maken ze elke vorm van manipulatie zichtbaar, niet alleen wijzigingen in velden.
record_hash in een koelketenlogboek?De record_hash is de ketenschakel: de SHA-256 van de canonieke meetinhoud gecombineerd met de vorige record_hash. Zo vormen de hashes een eenrichtingsafhankelijkheid. De eerste meting in een zending gebruikt prev_hash = '0'. Wijzig een meting en elke record_hash erna verandert.
Voer verifyChain() uit op de geëxporteerde metingen. Het berekent elke data_hash vanuit de inhoud en elke record_hash vanuit de inhoud plus de voorganger opnieuw en vergelijkt ze met de opgeslagen waarden. De controle is deterministisch, herhaalbaar en werkt offline. Een auditor kan het resultaat dus reproduceren zonder FahCel te hoeven vertrouwen.
Vanaf die meting mislukt de verificatie. Als meting #3 wordt gewijzigd, falen #4 tot en met #N omdat hun opgeslagen record_hash niet meer overeenkomt met de herberekende hash. De eerste gebroken schakel wordt gemarkeerd en alles erna geldt als onbetrouwbaar. Je ziet dus waar de manipulatie begon, niet alleen dat die plaatsvond.
Het hashen gebruikt SHA-256 volgens FIPS 180-4. Het controlespoor dat manipulatie zichtbaar maakt is ontworpen op basis van 21 CFR Part 11 §11.10(e). Die bepaling vereist veilige, computergegenereerde controlesporen met tijdstempels die eerdere informatie niet verbergen. Het ondersteunt ook de registratie-eisen van EU GDP.
In een QA-demo van 20 minuten verzegelen we temperatuurmetingen bij ontvangst, voeren we verifyChain uit en wijzigen we één meting. Je ziet precies waar de keten dat detecteert. Geen slides, maar het echte systeem en de echte hashes.