Objekt-Handle-Mapping
Ein zentraler Aspekt der DuoKey-PKCS#11-Bibliothek ist das Objekt-Handle-Mapping-System, das zwischen den Integer-Objekt-Handles von PKCS#11 und den dauerhaften Schlüsselbezeichnern des DuoKey Cockpit vermittelt.
Überblick
Das Problem
PKCS#11 referenziert Objekte über Integer-Handles (32-Bit-Ganzzahlen ohne Vorzeichen), während das DuoKey Cockpit Schlüssel über dauerhafte Bezeichner (Zeichenketten im UUID-Format) referenziert. Das Mapping-System übersetzt zwischen beiden.
PKCS#11-Handles
- Typ:
CK_OBJECT_HANDLE(Integer) - Geltungsbereich: pro Session (Handles sind sitzungsspezifisch)
- Lebensdauer: nur gültig, solange die Session geöffnet ist
DuoKey-Schlüsselbezeichner
- Typ: Zeichenkette (UUID-Format, z. B.
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) - Geltungsbereich: dauerhaft und plattformweit eindeutig
- Lebensdauer: persistent (Bezeichner ändern sich nicht)
So funktioniert es
Mapping-Prozess
Handle-Generierung
Handles werden pro Session generiert:
Algorithmus:
- Das erste Handle wird dem ersten Objekt zugewiesen.
- Für jedes neue Objekt wird inkrementiert.
- Das Mapping wird in der Handle-Tabelle der Session gespeichert.
Mapping-Tabelle
Jede Session verwaltet ihre eigene Mapping-Tabelle mit zwei Sichten:
- Vorwärts: Handle → Schlüsselbezeichner
- Rückwärts: Schlüsselbezeichner → Handle (für schnelle Reverse-Lookups)
Operationen: ein neues Mapping einfügen, einen Bezeichner für ein Handle nachschlagen, ein Handle für einen Bezeichner rückwärts nachschlagen und ein Mapping löschen, wenn ein Objekt zerstört wird.
Objekttypen
Secret Keys
AES-Schlüssel, die für die Wrap- / Unwrap-Operationen verwendet werden.
Handle: 0x12345
Type: CKO_SECRET_KEY
Algorithm: AES-256
Data Objects
Metadatenobjekte, die Oracle zur Verfolgung von Keystore-Informationen verwendet.
Handle: 0x12346
Type: CKO_DATA
Label: ORACLE.TDE.CDB$ROOT.MK.IDENT
Handle-Lebenszyklus
Erstellung
Handles werden erstellt, wenn Objekte gefunden werden (C_FindObjects), wenn ein Schlüssel generiert wird (C_GenerateKey) oder wenn ein Datenobjekt erstellt wird (C_CreateObject).
Verwendung
Operationen, die ein Handle entgegennehmen: C_Encrypt / C_Decrypt (Wrap / Unwrap), C_GetAttributeValue und C_DestroyObject.
Bereinigung
Handles werden ungültig, wenn die Session geschlossen wird; ein einzelnes Mapping wird entfernt, wenn das zugehörige Objekt zerstört wird.
Beispielszenarien
Szenario 1: Einen vorhandenen Masterschlüssel finden
- Oracle ruft
C_FindObjectsmit einem Template wie{ CKA_LABEL: "TDE-MASTER-20251219" }auf. - Die Bibliothek bittet das Cockpit, den Schlüssel anhand dieses Labels zu lokalisieren.
- Das Cockpit gibt den Schlüsselbezeichner zurück.
- Die Bibliothek prüft ihre Mapping-Tabelle; der Bezeichner ist neu, also weist sie ein Handle zu (z. B.
0x12345) und speichert das Mapping. - Sie gibt das Handle
0x12345an Oracle zurück.
Szenario 2: Einen Tablespace-Key wrappen
- Oracle ruft
C_Encrypt(session, 0x12345, tablespaceKey)auf. - Die Bibliothek schlägt den Schlüsselbezeichner für das Handle
0x12345nach. - Die Bibliothek bittet das Cockpit, den Tablespace-Key unter diesem Masterschlüssel zu wrappen (längenerhaltendes AES-CBC-PAD).
- Das Cockpit gibt den gewrappten Schlüssel zurück.
- Die Bibliothek gibt den gewrappten Schlüssel an Oracle zurück.
Szenario 3: Einen neuen Masterschlüssel generieren
- Oracle ruft
C_GenerateKey(session, mechanism, template)für einen AES-256-Schlüssel auf. - Die Bibliothek bittet das Cockpit, den Schlüssel bereitzustellen.
- Das Cockpit gibt den neuen Schlüsselbezeichner zurück.
- Die Bibliothek weist ein Handle zu (z. B.
0x12346) und speichert das Mapping. - Sie gibt das Handle
0x12346an Oracle zurück.
Leistungsüberlegungen
- Lookup: O(1) im Durchschnittsfall (Hash-Map-Lookup).
- Handle-Wiederverwendung: Wird derselbe Bezeichner erneut angefordert, wird das vorhandene Handle zurückgegeben, um doppelte Mappings zu vermeiden.
- Reverse Lookup: Eine Bezeichner-→-Handle-Map ermöglicht schnelle Reverse-Lookups.
- Speicher: Mappings werden gelöscht, wenn die Session geschlossen wird.
Fehlerbehandlung
| Szenario | Antwort |
|---|---|
| Oracle übergibt ein Handle, das nicht in der Mapping-Tabelle enthalten ist | CKR_OBJECT_HANDLE_INVALID |
| Ein zuvor zurückgegebener Schlüsselbezeichner existiert nicht mehr (Objekt zwischen Operationen gelöscht) | CKR_DEVICE_ERROR |
Bewährte Praktiken
- Handles nicht über Sessions hinweg zwischenspeichern — sie sind sitzungsspezifisch.
- Handles vor der Verwendung validieren.
- Mappings beim Schließen der Session bereinigen.
- Ordnungsgemäß löschen mit
C_DestroyObject, damit Mappings entfernt werden.
Nächste Schritte
- PKCS#11-Schnittstellenschicht → - Sehen Sie, wie Handles verwendet werden
- Kommunikationsfluss → - Verstehen Sie den End-to-End-Ablauf
- Kryptografische Mechanismen → - Erfahren Sie mehr über unterstützte Operationen