So speichert Kode deine Codes
Wo Kode deine 2FA-Schlüssel aufbewahrt, wie sie synchronisiert werden und wie du sie wieder herausbekommst.
Nur in deinem Schlüsselbund
Jedes Konto – auch der geheime Schlüssel, aus dem die Codes entstehen – wird als ein Eintrag im Schlüsselbund des iPhone gespeichert, verfügbar nach dem ersten Entsperren. Der Schlüssel landet nie in der Datenbank der App, in Einstellungen, in Logdateien, in Analysen oder in Absturzberichten.
iCloud-Schlüsselbund
Mit aktivierter Synchronisierung (Standard) ist der Eintrag als synchronisierbar markiert, sodass der iCloud-Schlüsselbund ihn auf deine anderen Apple-Geräte und ein neues iPhone bringt. Der iCloud-Schlüsselbund ist durchgehend verschlüsselt. Schaltest du die Synchronisierung aus, werden die Schlüssel nur auf diesem iPhone gespeichert („nur dieses Gerät“) und ziehen nicht auf ein anderes Telefon mit.
Kein Server
Kode stellt keine Netzwerkverbindungen her. Die Codes werden nach dem TOTP-Standard (RFC 6238) mit HMAC-SHA1/256/512 berechnet – dieselben Codes wie in Google Authenticator.
Sperre
Face ID oder Code beim Öffnen der App und erneut nach einer Minute im Hintergrund. Solange die App nicht aktiv ist, verdeckt ein Sperrbildschirm alles, sodass der App-Umschalter nie einen Code zeigt. Ein kopierter Code verschwindet nach 60 Sekunden aus der Zwischenablage des iPhone. Über die universelle Zwischenablage kannst du ihn auf deinem Mac einsetzen; dort bleibt er, bis du etwas anderes kopierst.
Das Format der Backup-Datei
Das verschlüsselte Backup ist eine JSON-Datei. Der Schlüssel wird mit PBKDF2-HMAC-SHA256 (600.000 Runden, 16 Byte Salt) aus deinem Passwort abgeleitet, und der Inhalt wird mit AES-256-GCM verschlüsselt. ciphertext ist der verschlüsselte Text, gefolgt vom 16 Byte langen GCM-Tag. Alle binären Felder sind Base64.
{
"format": "kode-backup",
"version": 1,
"kdf": { "name": "PBKDF2-HMAC-SHA256", "iterations": 600000, "salt": "…" },
"cipher": { "name": "AES-256-GCM", "nonce": "…" },
"ciphertext": "…"
}
Entschlüsselt ist der Inhalt eine Liste von Konten. Jedes Konto hat außerdem eine fertige otpauth://-Adresse, die die meisten Apps importieren können.
{
"created": "2026-09-24T09:41:00Z",
"accounts": [
{
"issuer": "GitHub", "name": "anna", "secret": "JBSWY3DPEHPK3PXP",
"algorithm": "SHA1", "digits": 6, "period": 30,
"uri": "otpauth://totp/GitHub:anna?secret=JBSWY3DPEHPK3PXP&issuer=GitHub&algorithm=SHA1&digits=6&period=30"
}
]
}
So entschlüsselst du die Datei ohne Kode (Python mit dem Paket cryptography):
import base64, getpass, hashlib, json, sys
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
backup = json.load(open(sys.argv[1]))
b64 = base64.b64decode
key = hashlib.pbkdf2_hmac("sha256", getpass.getpass().encode(),
b64(backup["kdf"]["salt"]), backup["kdf"]["iterations"], 32)
plain = AESGCM(key).decrypt(b64(backup["cipher"]["nonce"]), b64(backup["ciphertext"]), None)
for account in json.loads(plain)["accounts"]:
print(account["uri"])