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 correct horse in
“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
Vier bewerkingen
| Bewerking | Sleutel nodig? | Terug te draaien? | Waarvoor dient het |
|---|---|---|---|
| Coderen (base64) | nee | ja, door iedereen | bytes vervoeren waar alleen tekst past. Het beschermt niets |
| Hashen (SHA-256) | nee | nee, en dezelfde invoer geeft altijd dezelfde digest | laten zien dat twee dingen hetzelfde zijn, zoals de ETag deed |
| Ondertekenen met een tag met sleutel | één geheime sleutel, gedeeld door maker en controleur | niet teruggedraaid: opnieuw berekend en vergeleken | laten zien dat een bericht gemaakt is door iemand die de sleutel heeft, en sindsdien niet veranderd is |
| Versleutelen | ja | alleen met de sleutel | de 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:
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
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
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.