DPAPI in Access: Wie ich Zugangsdaten und Tokens sicher verschlüssele

Warum ich nicht im Klartext speichere

Viele speichern Tokens, API-Schlüssel oder Passwörter einfach so in Access-Tabellen.
Oder schlimmer: in Klartext-INI-Dateien, im Autoexec-Modul, in Abfragen.
Das ist grob fahrlässig – gerade in KMU-Umgebungen mit Netzlaufwerken, geteilten Frontends und mehreren Benutzern.

Ich nutze die eingebaute Windows-Verschlüsselung: DPAPI.
Damit kann ich Tokens sicher speichern – benutzergebunden, systemnah und ohne externe Tools.

Was DPAPI ist

DPAPI steht für Data Protection API.
Sie ist Teil von Windows seit XP.
Sie speichert und entschlüsselt Daten im Kontext des aktuellen Benutzers oder Computers.
Sie ist standardmäßig verschlüsselt – mit interner Windows-Zertifikatslogik.
Du brauchst dafür keine Schlüssel, kein Master-Passwort, nichts.

Wann ich das einsetze

  • REST-API-Tokens aus WordPress oder Azure
  • SMTP-Zugangsdaten (wenn ich keine OAuth-Anbindung habe)
  • SQL-Passwörter bei Linked Servern
  • FTP-Zugänge für Automatisierungen

Architektur

KomponenteZweck
DPAPI-Verschlüsselungsichert den Token im Benutzerkontext
TEMP-DateiAblageort für verschlüsselte Daten
VBA-Funktionliest/schreibt den verschlüsselten Token
Access-Logikverwendet entschlüsselten Token im Code

1. Vorbereitung: DPAPI in Access einbinden

Modul modDPAPI

Füge folgendes Modul ein (für 64-Bit Access):

Private Declare PtrSafe Function CryptProtectData Lib "crypt32.dll" ( _
    ByRef pDataIn As DATA_BLOB, _
    ByVal szDataDescr As LongPtr, _
    ByRef pOptionalEntropy As Any, _
    ByVal pvReserved As LongPtr, _
    ByRef pPromptStruct As Any, _
    ByVal dwFlags As Long, _
    ByRef pDataOut As DATA_BLOB) As Long

Private Declare PtrSafe Function CryptUnprotectData Lib "crypt32.dll" ( _
    ByRef pDataIn As DATA_BLOB, _
    ByVal szDataDescr As LongPtr, _
    ByRef pOptionalEntropy As Any, _
    ByVal pvReserved As LongPtr, _
    ByRef pPromptStruct As Any, _
    ByVal dwFlags As Long, _
    ByRef pDataOut As DATA_BLOB) As Long

Private Type DATA_BLOB
    cbData As Long
    pbData As LongPtr
End Type

Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    ByRef Destination As Any, _
    ByVal Source As LongPtr, _
    ByVal Length As Long)

2. Token verschlüsseln

Funktion

Function TokenVerschlüsseln(s As String) As Byte()
    Dim inBlob As DATA_BLOB, outBlob As DATA_BLOB
    Dim b() As Byte
    b = StrConv(s, vbFromUnicode)
    inBlob.cbData = UBound(b) + 1
    inBlob.pbData = VarPtr(b(0))

    If CryptProtectData(inBlob, 0, ByVal 0&, 0, ByVal 0&, 0, outBlob) Then
        ReDim result(0 To outBlob.cbData - 1) As Byte
        CopyMemory result(0), outBlob.pbData, outBlob.cbData
        TokenVerschlüsseln = result
    Else
        Err.Raise vbObjectError + 1, , "Verschlüsselung fehlgeschlagen"
    End If
End Function

3. Token entschlüsseln

Funktion

Function TokenEntschlüsseln(b() As Byte) As String
    Dim inBlob As DATA_BLOB, outBlob As DATA_BLOB
    inBlob.cbData = UBound(b) + 1
    inBlob.pbData = VarPtr(b(0))

    If CryptUnprotectData(inBlob, 0, ByVal 0&, 0, ByVal 0&, 0, outBlob) Then
        Dim buf() As Byte
        ReDim buf(0 To outBlob.cbData - 1) As Byte
        CopyMemory buf(0), outBlob.pbData, outBlob.cbData
        TokenEntschlüsseln = StrConv(buf, vbUnicode)
    Else
        Err.Raise vbObjectError + 2, , "Entschlüsselung fehlgeschlagen"
    End If
End Function

4. Token speichern in Datei

Ich speichere verschlüsselte Daten in eine Datei im TEMP-Ordner des aktuellen Benutzers.
Kein Klartext, keine .accdb-Tabelle, keine Registry.

Schreiben

Sub SpeichereToken(token As String)
    Dim pfad As String
    pfad = Environ("TEMP") & "\wp_token.dat"
    Dim b() As Byte
    b = TokenVerschlüsseln(token)
    Open pfad For Binary As #1
    Put #1, , b
    Close #1
End Sub

Lesen

Function LadeToken() As String
    Dim pfad As String
    pfad = Environ("TEMP") & "\wp_token.dat"
    If Dir(pfad) = "" Then Exit Function
    Dim b() As Byte
    Open pfad For Binary As #1
    ReDim b(0 To LOF(1) - 1)
    Get #1, , b
    Close #1
    LadeToken = TokenEntschlüsseln(b)
End Function

5. Beispiel-Anwendung

Sub VerbindeMitAPI()
    Dim token As String
    token = LadeToken()
    If token = "" Then
        MsgBox "Kein Token gefunden."
        Exit Sub
    End If

    Dim antwort As String
    antwort = HoleJsonMitToken("https://deine-api.de/v1/auftrag", token)
    Debug.Print antwort
End Sub

JSON-Abruf mit Token

Function HoleJsonMitToken(URL As String, Token As String) As String
    Dim http As Object
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

    http.Open "GET", URL, False
    http.SetRequestHeader "Authorization", "Bearer " & Token
    http.Send

    If http.Status = 200 Then
        HoleJsonMitToken = http.ResponseText
    Else
        HoleJsonMitToken = ""
    End If
End Function

6. Sicherheit & Einschränkungen

PunktBemerkung
BenutzerbindungNur der Windows-Benutzer kann entschlüsseln
Maschinenbindung möglichOptional mit Maschinen-Kontext
Kein Masterpasswort nötigSicher durch OS
Datenverlust bei Profil-ResetToken muss neu gespeichert werden

DPAPI ist nicht perfekt, aber für Access-Projekte mehr als ausreichend.

Mein sichererereres Fazit

Wenn Du mit Web-APIs arbeitest, kommst Du um Token nicht herum.
Und wenn Du Tokens speicherst, tu es nicht im Klartext.
DPAPI ist die pragmatischste Lösung: schnell, sicher, wartbar.
Funktioniert in jedem Windows-Access-Projekt – ohne Zusatztools.

Kategorien:

Keine Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert