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
Komponente | Zweck |
---|---|
DPAPI-Verschlüsselung | sichert den Token im Benutzerkontext |
TEMP-Datei | Ablageort für verschlüsselte Daten |
VBA-Funktion | liest/schreibt den verschlüsselten Token |
Access-Logik | verwendet 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
Punkt | Bemerkung |
---|---|
Benutzerbindung | Nur der Windows-Benutzer kann entschlüsseln |
Maschinenbindung möglich | Optional mit Maschinen-Kontext |
Kein Masterpasswort nötig | Sicher durch OS |
Datenverlust bei Profil-Reset | Token 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.
Keine Antworten