Kode

Kode가 코드를 저장하는 방법

Kode가 2단계 인증 키를 어디에 보관하고, 어떻게 동기화하며, 어떻게 다시 꺼낼 수 있는지.

내 키체인에만

각 계정은 코드를 만드는 비밀 키까지 포함해 iPhone 키체인에 하나의 항목으로 저장되며, 처음 잠금 해제한 뒤에 사용할 수 있습니다. 키는 앱의 데이터베이스, 설정, 로그 파일, 분석, 충돌 보고서에 절대 저장되지 않습니다.

iCloud 키체인

동기화를 켜면(기본값) 항목이 동기화 가능으로 표시되어 iCloud 키체인이 다른 Apple 기기와 새 iPhone으로 옮겨 줍니다. iCloud 키체인은 종단 간 암호화됩니다. 동기화를 끄면 키는 이 iPhone에만(‘이 기기만’) 남고 다른 휴대폰으로 옮겨지지 않습니다.

서버 없음

Kode는 네트워크 통신을 하지 않습니다. 코드는 TOTP 표준(RFC 6238)에 따라 HMAC-SHA1/256/512로 계산됩니다. Google Authenticator와 같은 코드입니다.

잠금

앱을 열 때, 그리고 백그라운드에 1분 넘게 있었을 때 Face ID나 암호를 요청합니다. 앱이 활성 상태가 아닐 때는 잠금 화면이 모든 것을 가려 앱 전환기에 코드가 보이지 않습니다. 복사한 코드는 60초 후 iPhone 클립보드에서 지워집니다. 범용 클립보드로 Mac에 붙여넣을 수 있으며, Mac에서는 다른 것을 복사할 때까지 남아 있습니다.

백업 파일 형식

암호화된 백업은 JSON 파일입니다. 키는 PBKDF2-HMAC-SHA256(600,000회 반복, 16바이트 솔트)으로 비밀번호에서 만들어지고, 내용은 AES-256-GCM으로 암호화됩니다. ciphertext는 암호문 뒤에 16바이트 GCM 태그가 붙은 것입니다. 모든 바이너리 필드는 Base64입니다.

{
  "format": "kode-backup",
  "version": 1,
  "kdf": { "name": "PBKDF2-HMAC-SHA256", "iterations": 600000, "salt": "…" },
  "cipher": { "name": "AES-256-GCM", "nonce": "…" },
  "ciphertext": "…"
}

복호화하면 내용은 계정 목록입니다. 각 계정에는 대부분의 앱에서 가져올 수 있는 otpauth:// 주소도 들어 있습니다.

{
  "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"
    }
  ]
}

Kode 없이 파일을 복호화하는 방법(Python, 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"])