Die Schlüssel zur Nutzung in Google Tink sind in „Keyset Handles“ gekapselt, um einen ungewollten Zugriff zu vermeiden. Eine Speicherung der Schlüssel kann auf drei verschiedene Arten erfolgen: als unverschlüsselter JSON-formatierter Datensatz, als verschlüsselter JSON-Datensatz und als verschlüsselter Binär-Datensatz.
Schauen wir uns einen unverschlüsselten Datensatz (ich nehme den AES128_GCM-Schlüssel aus Beispiel H02 Alle symmetrischen Verschlüsselungen).
Die Druckausgabe zeigt Euch diesen Aufbau:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "primaryKeyId": 1372349994, "key": [{ "keyData": { "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey", "keyMaterialType": "SYMMETRIC", "value": "GhDmyI0tCM5AnFMRWH2Ut++L" }, "outputPrefixType": "TINK", "keyId": 1372349994, "status": "ENABLED" }] } |
Was können wir der Ausgabe entnehmen? In Zeilen 2 (sowie in Zeile 10) ist die Schlüssel-ID angegeben. Bei einer Verschlüsselung wird die genutzte Key-ID mit im verschlüsselten Datensatz gespeichert und eine Entschlüsselung funktioniert nur, wenn der zur Entschlüsselung genutzte Schlüssel dieselbe Key-ID hat. In Zeile 5 ist vermerkt, welche Anwendung den Schlüssel erzeugt hat und für welches Verfahren er erzeugt worden ist. Die folgende Zeile 6 gibt Auskunft über die Art der Nutzung – hier ist es die symmetrische Verschlüsselung. In Zeile 7 ist der Schlüssel in Form eines Base64-kodierten Strings abgespeichert – den schauen wir uns nachfolgend genauer an. Der outputPrefixType in Zeile 9 gibt an, in welchem Format der Schlüssel gespeichert ist („Tink“- oder „RAW“-Format). Die Zeile 10 enthält die aktuelle Key-ID (siehe Zeile 2) und in Zeile 11 ist im Status-feld vermerkt, ob der Schlüssel gültig ist („ENABLED“) oder ungültig ist („DISABLED“).
Falls Ihr Euch an dieser Stelle wundert, warum z.B. die Primary KeyID und die KeyID im selben Datensatz vorkommen – das hat damit zu tun, das eine Datei auch mehrere Schlüssel enthalten kann (durch „Schlüsselrotation“).
Nun analysieren wir den Schlüssel im Feld Value („GhDmyI0tCM5AnFMRWH2Ut++L“). Füttern wir den String in das Programm A09 Base64-Kodierung erhalten wir diese Ausgabe:
1 2 3 4 |
A09 Base64-Kodierung data64String (String-Format) :GhDmyI0tCM5AnFMRWH2Ut++L dataFromBase64Byte (Hex-Format) :1A10E6C88D2D08CE409C5311587D94B7EF8B |
Der Datensatz enthält 3 Felder, die sich so aufteilen:
1 2 3 4 |
dataFromBase64Byte (Hex-Format) :1A10E6C88D2D08CE409C5311587D94B7EF8B Google Tink Schlüssel-Typ :1A Schlüssellänge (x10=d16, x20=d32) :10 Schlüssel (hier 16 Byte lang) :E6C88D2D08CE409C5311587D94B7EF8B |
Kommen wir nun zu den verschlüsselten Speicherungen. Das Google-Konzept der sicheren „verschlüsselten Schlüssel“ basiert auf der Idee, das die Rechner mit dem Internet verbunden sind und der Benutzer einen Hauptschlüssel (den sogenannten Master Key) in einer Cloud-Anwendung gespeichert und abrufbar hat. Derzeit hat Google Tink hierfür die Clouds-Schlüsselspeicher von Google (Google Cloud KMS), Amazon (Amazon KMS) bzw. lokal auf einem Smartphone den Android Keystore (Android Keystore) und von Apple (Apple iOS KeyChain ist geplant) vorgesehen. Dieser MasterKey dient nach der Erzeugung eines individuellen Schlüssels zur verschlüsselten Speicherung und später auch zur Entschlüsselung des Schlüsselmaterials.
Dieser Artikel wird demnächst fortgesetzt.
Letzte Aktualisierung: 22.01.2019