Zurück zum Blog

Erste SchritteAnleitung

Einen API-Schlüssel sicher speichern: Umgebungsvariable, .gitignore, Leak beheben

Halte deinen CheapTokens-Schlüssel aus Code und git heraus: Setze eine Umgebungsvariable, füge .env zu .gitignore hinzu und wisse, was zu tun ist, wenn der Schlüssel leakt.

Von CheapTokens TeamVeröffentlicht am 6 Min. Lesezeit

Terminal mit einem Umgebungsvariablen-Export und einer .gitignore-Zeile für einen API-Schlüssel
Auf dieser Seite
  1. Warum der Schlüssel nicht in deinen Code gehört
  2. Schritt 1: Den Schlüssel in eine Umgebungsvariable legen
  3. Schritt 2: Eine .env-Datei verwenden, ohne sie zu committen
  4. Wenn der Schlüssel geleakt ist: Was zu tun ist, in welcher Reihenfolge
  5. Prüf dich selbst

Bewahre den Schlüssel in einer Umgebungsvariable auf, nicht in deinem Code, und halte jede .env-Datei mit einer Zeile in .gitignore aus git heraus. Wenn ein Schlüssel bereits irgendwo öffentlich gelandet ist, kümmere dich zuerst um den Schlüssel und räume danach auf: Die Git-Historie zu bereinigen, während der Schlüssel noch in deinem Code und deinen Tools steckt, bringt nichts.

Das ist die ganze Idee. Dieser Leitfaden ist die praktische Version (die Grundlagen stehen in What is an API key): drei Befehle, eine funktionierende Anfrage und ein kurzer Plan für den schlechten Tag.

Warum der Schlüssel nicht in deinen Code gehört#

Ein API-Schlüssel ist ein Passwort, das dein Geld ausgibt. Wer ihn hat, kann Anfragen auf deine Kosten senden, und der Dienst kann ihn nicht von dir unterscheiden.

Der übliche Weg, auf dem es schiefgeht, ist langweilig. Du fügst den Schlüssel in ein Skript ein, um die erste Anfrage zum Laufen zu bringen, das Skript funktioniert, du machst git push, und das Repository ist öffentlich. Oder du schickst einem Kollegen deine Konfigurationsdatei. Oder du machst einen Screenshot von einem Fehler, bei dem der Schlüssel in der Ecke sichtbar ist. Jedes Mal dasselbe Ergebnis.

GitHub kennt dieses Muster gut. Das Secret Scanning (GitHub-Dokumentation, geprüft am 29. Oktober 2026) durchsucht die gesamte Git-Historie auf allen Branches nach fest eingebetteten Zugangsdaten und ebenso Issues, Pull Requests, Diskussionen, Wikis und geheime Gists und löst einen Alarm aus, wenn es einen findet. Das heißt: Die Zeile im nächsten Commit zu löschen, ändert nichts: Der alte Commit enthält sie noch.

Hier ist dasselbe Skript vorher und nachher.

Vergleichen

Dasselbe Skript, Schlüssel aus dem Code entfernt

Schlüssel im Code

python
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key="<your-key>",  # pasted here: ends up in git
)

Schlüssel aus der Umgebung

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

Die zweite Version kann so wie sie ist zu GitHub, in einen Chat oder in ein Code-Review. Der Schlüssel lebt auf deiner Maschine, außerhalb der Datei.

Schritt 1: Den Schlüssel in eine Umgebungsvariable legen#

Eine Umgebungsvariable ist ein benannter Wert, den dein Terminal jedem Programm übergibt, das es startet. Das Skript fragt nach CHEAPTOKENS_API_KEY über den Namen und sieht nie, woher er kommt.

Unter macOS und Linux:

bash
export CHEAPTOKENS_API_KEY="<your-key>"

Unter Windows PowerShell:

powershell
setx CHEAPTOKENS_API_KEY "<your-key>"

Zwei Details bringen Leute zum Stolpern. export gilt nur für dieses Terminalfenster; um ihn zu behalten, füge die Zeile zu deinem Shell-Profil hinzu (~/.zshrc oder ~/.bashrc). Und setx ändert nicht das Fenster, in dem du es eingegeben hast: Öffne ein neues Terminal, bevor du testest.

Jetzt eine vollständige Anfrage. Sie nutzt den OpenAI-kompatiblen Endpunkt https://api.cheaptokens.dev/v1 und DeepSeek-V4-Flash mit seiner vollständigen ID (deepseek-ai/DeepSeek-V4-Flash-0731; nimm IDs aus der CheapTokens-Dokumentation, da sich die Namen zwischen Anbietern unterscheiden):

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

resp = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    messages=[{"role": "user", "content": "Say hi in five words."}],
)
print(resp.choices[0].message.content)
print(resp.usage)

Eine kurze Begrüßung ist eine Anfrage von etwa 20 Tokens rein und 20 raus, was zu aktuellen Preisen $0.0000023 entspricht (die vollständige Liste steht auf der Preisseite). Wenn du noch keine erste Anfrage gesendet hast, führt dich Your first API request with CheapTokens von null an durch.

Die Antwort des Modells kommt in choices[0].message.content zurück, und usage zeigt die gezählten Tokens. Der Schlüssel erscheint nie in der Datei.

Terminal mit den .env- und .gitignore-Befehlen
Die drei Befehle, die den Schlüssel aus git heraushalten

Schritt 2: Eine .env-Datei verwenden, ohne sie zu committen#

export in jedem neuen Fenster einzutippen, wird lästig. Eine .env-Datei hält den Wert an einer Stelle, neben dem Projekt:

text
CHEAPTOKENS_API_KEY=<your-key>

Python liest sie mit python-dotenv (pip install python-dotenv):

python
from dotenv import load_dotenv
load_dotenv()  # fills os.environ from .env

Die Datei ist nur sicher, wenn git sie nie sieht. Füge sie vor dem ersten Commit zu .gitignore hinzu:

bash
echo ".env" >> .gitignore
git check-ignore -v .env

Wenn alles stimmt, gibt der zweite Befehl etwas wie .gitignore:1:.env .env aus: git sagt dir, welche Regel die Datei ignoriert. Wenn er nichts ausgibt, funktioniert die Regel nicht. Erstelle unter Windows .gitignore in einem Editor mit einer Zeile .env oder verwende Add-Content .gitignore .env: PowerShells >> kann UTF-16 schreiben, was git möglicherweise ignoriert.

Eine Falle: .gitignore wirkt nur auf Dateien, die git noch nicht verfolgt. Wenn .env bereits einmal committet wurde, führe git rm --cached .env aus, damit git aufhört, sie zu verfolgen, und behandle den darin enthaltenen Schlüssel als offengelegt (mehr dazu unten). Eine saubere Angewohnheit ist, eine .env.example mit dem Variablennamen und einem Platzhalter statt des Werts zu committen, damit ein Teammitglied weiß, was es setzen muss.

Wenn der Schlüssel geleakt ist: Was zu tun ist, in welcher Reihenfolge#

Vielleicht ist der Schlüssel in ein öffentliches Repo gelangt, vielleicht stand er in einem Screenshot, vielleicht hast du die ganze Konfiguration in einen Forumsthread eingefügt. Die Reihenfolge ist wichtiger als die Geschwindigkeit eines einzelnen Schritts.

GitHubs eigene Empfehlung (dieselbe Seite, geprüft am 29. Oktober 2026) ist, die Zugangsdaten sofort zu rotieren; die Git-Historie umzuschreiben ist optional und oft unnötig, sobald die Zugangsdaten widerrufen sind. Leute neigen dazu, es umgekehrt zu machen: Sie verbringen eine Stunde mit dem Bereinigen der Historie, während der Schlüssel noch funktioniert. Tu das nicht.

Wähle deinen Fall

Was ist mit deinem Schlüssel passiert? Wähle den nächstliegenden Fall

Der Schlüssel war in einem Commit, der jetzt öffentlich ist

Entferne den Schlüssel zuerst aus dem Code, wechsle zur Umgebungsvariable, füge .env zu .gitignore hinzu und prüfe dein Guthaben auf Anfragen, die du nicht gesendet hast. Die Historie zu bereinigen ist danach ein Nice-to-have, nicht der dringende Teil.

Der Schlüssel war in einem Screenshot oder einer geteilten Datei

Gleiche Reihenfolge: Höre auf, diesen Schlüssel in deinen Tools zu verwenden, und wechsle zur Umgebungsvariable, dann lösche den Beitrag oder die Datei, wenn du kannst. Ein gelöschter Screenshot wurde möglicherweise bereits kopiert, also verlass dich nicht allein auf das Löschen.

Derselbe Schlüssel wird in mehreren Tools verwendet

Gehe jeden Ort durch, an dem der Schlüssel lag: dein Shell-Profil, .env-Dateien, Editor- und Terminal-Tools, und richte jedes auf die Umgebungsvariable aus, sodass es nur eine Stelle zum Ändern gibt. Wenn ein Tool die Variable nicht lesen kann, zeigt der 401/404-Fehlerbehebungsleitfaden, wie der Fehler aussieht.

Drei Schritte nach einem Leak: Schlüssel aus dem Code nehmen, jedes Tool aktualisieren, eine Testanfrage senden
Schlüssel zuerst aus dem Code, dann jedes Tool, dann eine Testanfrage

Sende nach der Bereinigung eine kleine Testanfrage wie in Schritt 1 und prüfe dein Guthaben. Wenn sie antwortet und Guthaben und Anfragen normal aussehen, ist die Bereinigung abgeschlossen; behalte das Guthaben in den nächsten Tagen im Auge. Ein Schlüssel, der öffentlich war, sollte als offengelegt behandelt werden, auch nachdem du ihn aus dem Code entfernt hast, also achte auf Guthaben und Anfragezahl auf alles, was du nicht gesendet hast, und verwende diesen Schlüssel nicht an neuen Stellen wieder. Zu den Orten, an denen ein Schlüssel typischerweise lebt, siehe Where to plug in your own API key.

Prüf dich selbst#

Probier es selbstProbier es aus: Hebe die Variable auf und führe das Skript aus. Was siehst du?Antwort anzeigen

Python bricht mit KeyError: 'CHEAPTOKENS_API_KEY' ab, bevor eine Anfrage deine Maschine verlässt. Das ist der gute Fehlerfall: Das Skript weigert sich, ohne den Schlüssel zu laufen, statt still einen eingefügten zu verwenden. Wenn du stattdessen einen 401 siehst, ist die Variable gesetzt, aber der Schlüssel falsch; prüfe den Schlüssel und die Adresse anhand des 401/404-Leitfadens.