0%

Hoofdstuk 2

Hashes, MAC's en willekeurige waarden

Coderen, hashen, ondertekenen of versleutelen

Je aanvalstest uit hoofdstuk 1 doorzoekt een kopie van de state op de tekst correct horse. Stel dat de server in plaats daarvan Y29ycmVjdCBob3JzZQ== voor ana opsloeg. Zou de test slagen? Ja: de tekst waarnaar hij zoekt, is weg. Zou het wachtwoord veilig zijn? Nee. Die is correct horse in , en iedereen kan hem terugzetten.

“Het wachtwoord is niet leesbaar” is dus een te los doel. Vier verschillende bewerkingen kunnen data onleesbaar laten lijken, en ze beloven vier verschillende dingen. Twee ervan heb je al gebruikt, base64 in de Basic-header en een -digest als , zonder dat je tussen ze hoefde te kiezen. Deze les houdt alle vier uit elkaar.

Vier bewerkingen

BewerkingSleutel nodig?Terug te draaien?Waarvoor dient het
Coderen (base64)neeja, door iedereenbytes vervoeren waar alleen tekst past. Het beschermt niets
Hashen (SHA-256)neenee, en dezelfde invoer geeft altijd dezelfde digestlaten zien dat twee dingen hetzelfde zijn, zoals de ETag deed
Ondertekenen met een tag met sleuteléén geheime sleutel, gedeeld door maker en controleurniet teruggedraaid: opnieuw berekend en vergelekenlaten zien dat een bericht gemaakt is door iemand die de sleutel heeft, en sindsdien niet veranderd is
Versleutelenjaalleen met de sleutelde inhoud verbergen

Lees de tabel per kolom. De sleutelkolom vraagt wie de bewerking kan uitvoeren: bij coderen en hashen iedereen. De kolom terugdraaien vraagt wie de invoer terug kan krijgen: bij coderen iedereen, bij hashen niemand. Preciezer gezegd: niemand kent een manier om de invoer uit een digest te berekenen. Een invoer kan nog steeds geraden en gecontroleerd worden, en daar gaat hoofdstuk 3 over.

Drie van de vier zitten in de standaardbibliotheek van Python:

Try it

Het eerste paar regels is coderen: b'Y29ycmVjdCBob3JzZQ==', en daarna weer b'correct horse', zonder dat er een sleutel aan te pas komt. Het tweede paar is hashen: twee keer dezelfde 64 tekens, beginnend met 4104d36f. Niets zet ze terug in het wachtwoord, maar iedereen die het wachtwoord heeft, kan ze berekenen. De laatste twee regels zijn nieuw. Het zijn tags met sleutel van dezelfde bytes onder twee verschillende sleutels, ingekort tot hun eerste 8 tekens, en ze verschillen: b4520de8 en 20c498cf. Alleen iemand die de sleutel heeft, kan de tag berekenen die erbij hoort. De volgende les legt hmac.new uit.

Wat drukt print(base64.b64decode("Y29ycmVjdCBob3JzZQ==")) af?

Twee dingen die ondertekenen heten

Het woord “ondertekenen” wordt gebruikt voor twee verschillende mechanismen, en het helpt om ze vanaf het begin uit elkaar te houden.

Een , of MAC, is een tag die gemaakt is met een gedeelde geheime sleutel. Wie de tag kan controleren, heeft de sleutel, en had hem dus ook kunnen maken. Een MAC vertelt de server “dit komt van iemand met onze sleutel”, en dat is handig als de server met zichzelf praat: hij geeft nu een bericht uit en wil het later herkennen.

Een handtekening met een publieke sleutel (public-key signature) wordt gemaakt met een privésleutel en gecontroleerd met een andere, publieke sleutel. Iedereen kan haar controleren, en maar één partij kan haar maken.

Deze cursus maakt MAC’s en noemt dat ondertekenen, en dat is ook het woord dat tokenbibliotheken gebruiken. De andere soort kom je in hoofdstuk 10 tegen, in een .

Wat deze cursus niet bouwt

Je schrijft hier geen versleuteling en geen handtekeningen met een publieke sleutel. De standaardbibliotheek van Python heeft geen algemene manier om data te versleutelen of een handtekening met een publieke sleutel te maken. De ssl doet allebei, maar alleen binnen . En niemand zou ze zelf moeten schrijven: dit zijn de delen van beveiliging waar een kleine fout onzichtbaar en fataal is. Waar deze cursus geheimhouding op het netwerk nodig heeft, gebruikt hij TLS, in hoofdstuk 10.

Kiezen

Vier situaties, en de bewerking die elk ervan vraagt:

  • Een header mag alleen gewone tekens bevatten, en je moet er willekeurige bytes in zetten. Dat is coderen. Het was de taak van base64 in de Basic-header.

  • Een client wil weten of de boekenlijst veranderd is sinds hij het laatst vroeg. Dat is hashen: gelijke digests betekenen gelijke body’s.

  • De server geeft een client een kort bericht en moet later weten dat wat terugkomt, is wat hij maakte. Dat is een tag met sleutel.

  • Niemand op het netwerkpad mag een wachtwoord lezen terwijl het onderweg is. Dat is versleutelen, en hier betekent het TLS.

Een site biedt een bestand aan om te downloaden en toont er een waarde naast, zodat iedereen kan controleren dat de gedownloade kopie gelijk is aan het bestand op de site. Niemand die erbij betrokken is, heeft een geheim. Welke bewerking?

Een database slaat elk wachtwoord gecodeerd in base64 op. Wat heeft een dief met een kopie?

Van de vier bewerkingen heeft er één nog geen code in je project: de tag met sleutel. In de volgende les schrijf je die.