Vooraf: niet bedoeld als verwijt! Het is complexe materie, ik licht toe voor de mensen die (net als ik) precies willen weten hoe het zit. Ook ik heb dit ooit moeten leren, en als ik iets fout heb (komt vaak voor) hoor ik dat natuurlijk graag.
Door Anoniem: Door Erik van Straten:
Jammer alleen dat als je Firefox downloadt, de signature over de binary nog uitsluitend SHA1 gebruikt.
Binary certificaat is eigenlijk niet meer zo interessant als je zeker weten downloadt van de originele site met HTTPS.
Vooral bij grotere downloads is er op Internet geen sprake meer van "de originele site". Sowieso staan de servers van Mozilla niet meer in de kelder van hun hoogdgebouw, dus weten Mozilla-medewerkers niet wie er allemaal toegang hebben tot die servers. Vervolgens vindt distributie van binaries plaats via vele CDN (Content Delivery Network) servers die op strategische locaties zijn opgesteld, inclusief het datacenter "om de hoek" en/of van jouw ISP.
M.a.w. zelfs als
https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=en-US jouw browser niet laat redirecten naar een http link, heb je geen idee vanaf welke fisieke server jouw browser (die je op dat moment nog gebruikt) Firefox downloadt. Zonder digitale handtekening (gezet door een door jou vertrouwd stel Mozilla-medewerkers die digitaal kunnen ondertekenen) zou er, in het brave Duitsland, een "Staatstrojaner" aan kunnen worden toegevoegd (in Nederland kan zoiets ook, maar ik denk hierbij vooral aan landen met minder burgerrechten).
Persoonlijk controleer ik dan ook altijd het gebruikte certificaat en vergelijk dit met eerdere downloads (niet omdat ik vind dat iedereen dit zou moeten doen, maar omdat
als er een keer iets niet klopt, ik denk te kunnen onderbouwen wat er niet klopt en Mozilla kan waarschuwen).
ECHTER: Ik vermoed dat de meeste mensen niet begrijpen wat het risico is bij MD5 en SHA1.
Toelichting van de onderliggende techniek voor geïnteresseerden: een digitale handtekening bestaat uit een cryptografische hash over een bestand, waarna die hash is versleuteld met een private key uit een asymmetrisch sleutelpaar. De public key uit dat sleutelpaar wordt opgenomen in een digitaal signing certificaat, dat wordt toegevoegd aan het ondertekende bestand:
Signed file:
[Bytes van het bestand zelf met hash 123AB][Encrypted hash 9A3C7][Signing cert + intermediate certs]
(om die regel niet idioot lang te maken toon ik extreem ingekorte hexadecimale getallen, dit zijn geen echte hashes).
Kenmerkend voor asymmetrische cryptografie is:
1) Wat je met de private key versleutelt, kun je alleen decrypten met de bijpassende public key (met geen enkele andere public key en zelfs niet met de gebruikte private key). Dit proces gebruiken we voor het digitaal onderteken;
2) Wat je met de public key versleutelt, kun je alleen decrypten met de bijpassende private key (met geen enkele andere private key en zelfs niet met de gebruikte public key). Dit proces gebruiken we als we een bestand versleutelen zodanig dat alleen de bezitter van de private key het bestand kan decrypten (onder water wordt hierbij tevens een -random- symmetrische sleutel gebruikt, omdat het encrypten/decrypten van grote aantallen bytes met asymmetrische cryptografie veel te traag verloopt).
Terug naar 1, signing: ervan uitgaande dat je dat certificaat vertrouwt, kun je de versleutelde cryptografische hash (meegezonden met het bestand in de digitale handtekening, 9A3C7 in het voorbeeld) uitsluitend decrypten met de public key in het certificaat. Vervolgens bereken je ook zelf de hash over het bestand (tot aan, exclusief dus, de digitale handtekening en meegezonden certificaten) en vergelijkt de decrypted en berekende hashes met elkaar. Als zij identiek zijn (beide 123AB in het voorbeeld) en je het certificaat vertrouwt, kun je ervan uitgaan dat het bestand niet is gewijzigd sinds ondertekening. Dit geldt ook indien er een SHA1 of zelfs een MD5 hash is gebruikt.
Gegeven een
willekeurig bestand en een MD5 of SHA1 hash van dat bestand, is het nog steeds zo goed als onmogelijk om dat bestand zo te wijzigen dat de hash daarvan hetzelfde is. Dit is dus
niet het probleem.
Het probleem is dat de maker van een bestand (al dan niet daartoe gedwongen) een bestand zodanig kan manipuleren (dus voordat er gehashed wordt) dat er twee afwijkende versies van het bestand ontstaan die dezelfde hash opleveren.Dat risico is echt van een andere orde, maar niet verwaarloosbaar. Vooral bij certificaten zelf is het risico groot als dit mogelijk is: immers als iemand een schijnbaar simpel servercertificaatje aanvraagt, met SHA1 hashwaarde X, dat door een certificaatuitgever ongewijzigd wordt ondertekend met die SHA1 hashwaarde X, en de kwaadwillende
tevens een CA-certificaat heeft gegenereerd eveneens met SHA1 hashwaarde X, kan de kwaadwillende de digitale handtekening van dat siimpele certificaatje kopiëren naar het CA-certificaat om vervolgens naar believen zelf certificaten uit te geven.
Juist om dit scenario te voorkomen (ook bij momenteel nog als veilig beschouwde hashes) voegen certificaatuitgevers een random getal van minstens 64 bits toe aan elk CSR (certificate signing request, feitelijk een certificaat nog zonder handtekening van de uitgever, vergelijkbaar met het deel tussen de eerste twee bakhaken van de "Signed file" in het grijze vlak hierboven). Daardoor kan de aanvrager niet voorspellen wat de in de handtekening gebruikte hash zal zijn, en heeft het genereren van twee verschillende CSRs die dezelfde hash opleveren, dus geen zin.
Een ander scenario is bijv. een koopcontract in de vorm van een digitaal ondertekend PDF bestand. Ongewenst is natuurlijk dat er twee verschillende versies van kunnen bestaan met een identieke digitale handtekening over dezelfde hash van de twee verschillende versies (in tegenstelling tot platte tekst biedt het PDF formaat zat ruimte voor een blob ter compensatie van afwijkende teksten in de twee versies met dezelfde hash).
ConclusieSHA1 en MD5 zijn niet dusdanig gebroken dat bijv. een MitM een willekeurig bestand zodanig kan wijzigen dat de hash hetzelfde blijft. Vanwege een
andere reden, namelijk kwade opzet (eventueel gedwongen) in het proces t/m ondertekenen, hoor je MD5 en SHA1 niet meer te gebruiken voor digitale handtekeningen.