Digitale handtekeningen voor bestanden: authenticiteit bewijzen
Leer hoe digitale handtekeningen authenticiteit verifiëren en manipulatie voorkomen. Zorg dat ontvangers weten wie het bestand heeft verzonden.
Een digitale handtekening is een cryptografisch bewijs dat een specifieke persoon of entiteit een bestand heeft gemaakt en dat het bestand niet is gewijzigd sindsdien. Technisch gezien hash je het bestand met SHA-256, en "onderteken" je de hash vervolgens met je privésleutel via RSA-PSS, ECDSA of Ed25519. Iedereen met je publieke sleutel kan de handtekening verifiëren — als die klopt, weten ze dat jij het bestand hebt gemaakt en dat het byte-identiek is aan wat je hebt ondertekend. Handtekeningen zijn wat macOS gebruikt om app-updates te verifiëren, wat Git gebruikt voor commit-auteurschap (git commit -S), en wat PGP gebruikt voor ondertekende e-mails. Ze lossen een probleem op dat versleuteling alleen niet kan: bewijzen wie wat heeft verzonden.
Handtekeningen versus versleuteling: verschillende taken
Versleuteling houdt inhoud geheim. Handtekeningen bewijzen auteurschap en integriteit. Ze zijn complementair, geen alternatieven.
- Alleen versleutelen: ontvanger kent de inhoud maar niet wie het heeft verzonden. Iedereen met de publieke sleutel had het kunnen versleutelen.
- Alleen ondertekenen: ontvanger weet wie het heeft verzonden en dat het niet is gewijzigd, maar de inhoud is zichtbaar voor iedereen die onderschept.
- Ondertekenen en versleutelen: volledige authenticiteit, integriteit en vertrouwelijkheid. De standaardmodus van PGP.
Bestandsoverdrachtsservices richten zich doorgaans op versleuteling. Handtekeningen komen in beeld voor hoge-vertrouwenscontexten: softwaredistributie, juridische documenten, contracten, forensische bewijsketens.
Hoe ondertekening werkelijk werkt
De canonieke Ed25519-ondertekeningsflow:
- Hash het bericht:
h = SHA-512(bericht). - Bereken een deterministische nonce:
r = SHA-512(privésleutelprefiks || h). - Bereken het handtekeningspunt:
R = r·G(waar G het basispunt van de curve is). - Bereken
s = r + SHA-512(R || publieke sleutel || h)·privésleutel mod ℓ. - Handtekening is
(R, s), 64 bytes totaal.
Verificatie gebruikt alleen de publieke sleutel, het bericht en de handtekening. Als de wiskunde klopt, weet de verificateur dat de handtekening is geproduceerd door iemand die de bijbehorende privésleutel bezit.
RSA-PSS (PKCS#1 v2.2) en ECDSA werken vergelijkbaar maar met andere onderliggende wiskunde. Ed25519 heeft de voorkeur voor nieuwe systemen omdat het deterministisch is (geen per-handtekening willekeurige nonce die fout kan gaan) en sneller.
De drie veelgebruikte handtekeningalgoritmen
| Algoritme | Sleutelgrootte | Handtekeninggrootte | Snelheid | Opmerkingen | |-----------|----------------|---------------------|----------|-------------| | RSA-PSS-2048 | 256 bytes | 256 bytes | ~1000 ondert./s | Breed ondersteund, langzame sleutelgeneratie | | ECDSA P-256 | 32 bytes | 64 bytes | ~30.000 ondert./s | NIST-curve, vereist veilige RNG per handtekening | | Ed25519 | 32 bytes | 64 bytes | ~50.000 ondert./s | Deterministisch, moderne standaard |
Alle drie zijn goedgekeurd in NIST's FIPS 186-5 (2023). Ed25519 is de keuze voor nieuwe protocollen: WireGuard, SSH (standaard sinds OpenSSH 8.0), Signal, Git-commit-ondertekening en ondertekening van Rust's Cargo-pakket.
Codeondertekening: een veelgebruikte toepassing
Softwaredistributie vertrouwt op handtekeningen. Zonder hen kunnen gebruikers de echte installatieprogramma niet onderscheiden van malware:
- Apple Developer ID + Notarisatie. Alle macOS-apps moeten ondertekend en genotariseerd zijn sinds Catalina (2019). Gebruikt RSA-2048 of ECDSA P-256.
- Microsoft Authenticode. Windows-uitvoerbare bestanden ondertekend met RSA-3072 of ECDSA P-384-certificaten.
- Android APK v2/v3. Ed25519-handtekeningen over APK-inhoud.
- Debian apt, Red Hat dnf, npm, PyPI, Homebrew. Alle gebruiken losstaande handtekeningen (doorgaans GPG Ed25519 of RSA) over pakketmanifesten.
Een beruchte casus: in 2020 was de Orion-update van SolarWinds ondertekend met het legitieme certificaat van het bedrijf nadat aanvallers het bouwsysteem hadden gecompromitteerd. De handtekening was geldig — ze bewees alleen dat de code van een gecompromitteerde bron afkomstig was. Handtekeningen garanderen de identiteit van de ondertekenaar, niet het oordeel van de ondertekenaar.
PGP en losstaande handtekeningen voor bestanden
GnuPG (gpg) is nog steeds het werkpaard voor bestandshandtekeningen buiten bedrijfs-PKI. Een losstaande handtekening laat het bestand ongewijzigd en plaatst de handtekening in een afzonderlijk .sig-bestand:
gpg --detach-sign --armor document.pdf
# Produceert document.pdf.sig
gpg --verify document.pdf.sig document.pdf
# gpg: Goede handtekening van "Alice <alice@voorbeeld.com>"
De zwakte van PGP is sleuteldistributie: hoe weet de verificateur dat de ondertekeningssleutel werkelijk van Alice is? Opties zijn sleutelservers, web of trust, keybase.io of verificatie buiten de band (gepubliceerde vingerafdruk op een visitekaartje).
Moderne alternatieven: Sigstore (gebruikt door Kubernetes, npm) doet sleutellose ondertekening via OIDC-identiteitstokens, met transparantielogboeken die het web of trust vervangen. minisign door Frank Denis biedt eenvoudige Ed25519-ondertekening zonder de complexiteit van PGP.
Handtekeningaggregatie op basis van hashes
Voor verzamelingen bestanden is elke afzonderlijk ondertekenen inefficiënt. Beter: hash elk bestand, bouw een Merkle-boom, onderteken de wortel. Voordelen:
- Één handtekening dekt veel bestanden.
- Afzonderlijke bestanden kunnen worden geverifieerd tegen de wortel met log(n) broer-of-zus-hashes.
- Gebruikt door certificaattransparantielogboeken, Git en steeds vaker door supply-chain-hulpmiddelen zoals in-toto.
Een release van 10.000 bestanden die op deze manier is ondertekend, produceert één handtekening plus een 32-byte wortelhash, verifieerbaar tegen elke subset van de bestanden.
Tijdstempeling: bewijzen wanneer
Een handtekening bewijst wie, maar niet wanneer. Een aanvaller die je privésleutel steelt, kan handtekeningen backdateren. Trusted Timestamping Authorities (TSA's) lossen dit op door een tijdstempel over je handtekening te ondertekenen, waardoor die wordt verankerd aan een specifiek moment.
Standaarden:
- RFC 3161 tijdstempeling — gebruikt door Microsoft Authenticode, Adobe PDF-handtekeningen.
- RFC 5544 (CMS met tijdstempels).
- Roughtime — een nieuwer protocol van Google voor lage-latentie geverifieerde tijd.
Juridische documentondertekening (DocuSign, Adobe Sign, EU eIDAS-gekwalificeerde handtekeningen) vertrouwt op RFC 3161-tijdstempels van vertrouwde autoriteiten om vast te stellen wanneer een contract is ondertekend.
Handtekeningen in bestandsoverdracht
De meeste consumentgerichte bestandsoverdrachtsservices stellen handtekeningen niet direct beschikbaar — de AES-GCM-authenticatietag bewijst integriteit binnen de overdracht, en TLS bewijst de identiteit van de server, maar er is geen ingebouwde manier om de identiteit van de verzender te bewijzen.
Voor hoge-vertrouwensoverdrachten vindt ondertekening vóór de upload plaats:
- Verzender ondertekent het bestand met Ed25519 of PGP, wat
bestand.extenbestand.ext.sigproduceert. - Beide bestanden worden geüpload naar elke overdrachtsservice (HexaTransfer, SwissTransfer, WeTransfer).
- Ontvanger downloadt beide, verifieert de handtekening met de publieke sleutel van de verzender.
Dit ontkoppelt authenticiteit van het overdrachtskanaal — de overdrachtsservice kan worden gecompromitteerd zonder de geldigheid van de handtekening te breken, zolang de privésleutel van de verzender geheim blijft en de ontvanger de juiste publieke sleutel heeft.
EU eIDAS gekwalificeerde handtekeningen
De eIDAS-verordening van de Europese Unie (EU 910/2014, herzien in 2024 als eIDAS 2.0) definieert drie handtekeninglagen:
- Elektronische handtekening — basis, inclusief gescande handgeschreven handtekeningen.
- Geavanceerde elektronische handtekening (AES/AdES) — gekoppeld aan de ondertekenaar, detecteert knoeien. PGP-handtekeningen kwalificeren.
- Gekwalificeerde elektronische handtekening (QES) — AdES plus een gekwalificeerd certificaat van een Trust Service Provider, opgeslagen op een Qualified Signature Creation Device (smartcard of HSM).
QES heeft hetzelfde juridische gewicht als een handgeschreven handtekening in alle EU-lidstaten. Providers zijn onder anderen DocuSign EU, Adobe Sign EU, Namirial en DTrust. AVG-naleving en de eIDAS-vereisten zijn van toepassing op elke organisatie die elektronisch contracten ondertekent met EU-burgers.
Wanneer handtekeningen overdreven zijn
Niet elk bestand heeft een handtekening nodig. Sla die over wanneer:
- De ontvanger het overdrachtskanaal end-to-end vertrouwt (Signal, persoonlijke USB).
- De inhoud niet beveiligingskritisch is (vergaderingsfoto's, recepten, conceptdocumenten).
- Integriteit alleen voldoende is en geleverd wordt door AES-GCM of TLS.
Voeg handtekeningen toe wanneer:
- Juridisch of contractueel gewicht van belang is (contracten, rechtbankbewijs, medische dossiers).
- Supply-chain-vertrouwen in het geding is (softwarereleases, firmware-updates).
- Het bestand wordt doorgestuurd via niet-vertrouwde tussenpersonen.
- Je een duurzaam auditspoor nodig hebt dat de oorspronkelijke overdracht overleeft.
Aan de slag
Voor een eenvoudige workflow: genereer een Ed25519-sleutel met ssh-keygen -t ed25519 -f ~/.ssh/ondertekeningssleutel, onderteken een bestand met openssl pkeyutl -sign -inkey ondertekeningssleutel -in bestand -out bestand.sig, deel je publieke sleutel buiten de band en stuur het bestand via elke veilige overdrachtsservice. Ontvangers verifiëren met openssl pkeyutl -verify.
Probeer het op hexatransfer.com — gratis, zonder account, tot 10 GB.
Verstuur grote bestanden veilig met end-to-end-versleuteling
Draag bestanden tot 10 GB gratis over met end-to-end-versleuteling. Geen account nodig. Uw bestanden worden in uw browser versleuteld voordat ze worden geüpload — niemand anders kan ze lezen.
Een bestand verzenden