幣安 API Key 洩露是盜號案件的 Top3 根因:程式碼推 GitHub 被掃、截圖發群、明文存 JSON、離職員工帶走憑證。安全的核心是 永遠不把金鑰寫進程式碼、加密靜態儲存、程序啟動時才解密載入、定期輪換。本文覆蓋 6 種主流儲存方案與完整程式碼示例。配置前請先在 幣安官網 API 管理中建立合適許可權的金鑰;APP 端下載 幣安官方APP 可隨時檢視已建立 Key 列表。本文按洩露根因、環境變數、金鑰管理器、雲端 Secrets、輪換策略、IP 白名單聯動、審計日誌、應急響應 8 個環節展開。
一、為什麼明文儲存=資產歸零
常見洩露路徑統計(社群覆盤)
| 路徑 | 佔比 | 典型案例 |
|---|---|---|
| 程式碼推 GitHub/GitLab | 35% | .env 未加 gitignore,AWS/Binance 雙丟 |
| 群聊/Slack 截圖 | 20% | 除錯時發截圖帶 Key |
| 雲盤明文檔案 | 15% | iCloud/Google Drive 被撞庫 |
| 離職員工帶走 | 12% | 公司沒有金鑰輪換流程 |
| 公共 WiFi 中間人 | 8% | HTTP 請求被抓包(幣安都是 HTTPS 一般不受影響) |
| Docker 映象洩露 | 5% | Dockerfile 裡 ENV BINANCE_SECRET=... 推 Hub |
| 其他 | 5% | — |
GitHub 上有機器人 trufflehog、gitleaks 24/7 掃 Binance API Key 正則,洩露到提現通常只需要 5–15 分鐘。
幣安 API Key 特徵
API Key 格式:64 位十六進位制字元
示例: X1uKq3... (64 chars)
Secret 格式:64 位十六進位制字元
正則識別:[A-Za-z0-9]{64}
一旦 Key + Secret 洩露,盜號者可直接呼叫 /sapi/v1/capital/withdraw/apply 提幣,只要 Withdraw 許可權沒禁用。即便禁了 Withdraw,他也能拉高你賬號裡冷門幣對價格再自己反向吃單套利(洗錢)。
二、方案 A:環境變數(最基礎)
設定方式
# ~/.zshrc 或 ~/.bashrc
export BINANCE_API_KEY="X1uKq3...64位"
export BINANCE_API_SECRET="abcDef...64位"
# 載入
source ~/.zshrc
# 驗證
echo $BINANCE_API_KEY | head -c 8
Python 載入
import os
import sys
API_KEY = os.getenv('BINANCE_API_KEY')
API_SECRET = os.getenv('BINANCE_API_SECRET')
if not API_KEY or not API_SECRET:
print('ERROR: Missing BINANCE_API_KEY / BINANCE_API_SECRET')
sys.exit(1)
# 使用
from binance.client import Client
client = Client(API_KEY, API_SECRET)
Node.js 載入
const API_KEY = process.env.BINANCE_API_KEY;
const API_SECRET = process.env.BINANCE_API_SECRET;
if (!API_KEY || !API_SECRET) {
console.error('Missing Binance credentials');
process.exit(1);
}
const Binance = require('node-binance-api');
const client = new Binance().options({
APIKEY: API_KEY,
APISECRET: API_SECRET,
});
優點與風險
優點:零依賴,直接用。
風險:env 命令可列印所有變數;容器日誌可能包含 env;子程序繼承環境。僅適合本地單機開發,不建議生產。
三、方案 B:dotenv + gitignore
目錄結構
/project
.env <- 真實金鑰,絕不提交
.env.example <- 模板,佔位符
.gitignore
requirements.txt
strategy.py
.env 內容
BINANCE_API_KEY=X1uKq3...64位
BINANCE_API_SECRET=abcDef...64位
BINANCE_SUB_ALPHA_KEY=yyy...
BINANCE_SUB_ALPHA_SECRET=zzz...
.gitignore 必含
.env
.env.*
!.env.example
*.pem
*.key
secrets/
credentials.json
node_modules/
__pycache__/
Python dotenv
from dotenv import load_dotenv
load_dotenv()
import os
API_KEY = os.getenv('BINANCE_API_KEY')
推 GitHub 前執行 git status 確認 .env 在 "untracked files" 區,不在 staged。
pre-commit 鉤子防洩露
裝 pre-commit 框架 + gitleaks:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.18.0
hooks:
- id: gitleaks
執行 pre-commit install 後,每次 git commit 會掃描 diff 裡是否有 API Key 格式,命中直接阻斷 commit。
四、方案 C:作業系統金鑰庫
macOS Keychain
# 存
security add-generic-password \
-a binance \
-s binance-api-key \
-w "X1uKq3..."
# 讀
security find-generic-password \
-a binance \
-s binance-api-key \
-w
Python 讀取:
import subprocess
def get_secret(name):
result = subprocess.run(
['security', 'find-generic-password', '-a', 'binance', '-s', name, '-w'],
capture_output=True, text=True
)
return result.stdout.strip()
API_KEY = get_secret('binance-api-key')
API_SECRET = get_secret('binance-api-secret')
Windows Credential Manager
# 存
cmdkey /generic:BinanceAPIKey /user:binance /pass:X1uKq3...
# 透過 PowerShell SecretManagement 模組更友好
Install-Module Microsoft.PowerShell.SecretManagement
Register-SecretVault -Name BinanceVault -ModuleName Microsoft.PowerShell.SecretStore
Set-Secret -Name BinanceApiKey -Secret "X1uKq3..."
Linux libsecret / keyring
pip install keyring
import keyring
keyring.set_password('binance', 'api-key', 'X1uKq3...')
API_KEY = keyring.get_password('binance', 'api-key')
系統金鑰庫的優點是由作業系統登入態保護,鎖屏後需要重新認證才能讀取。
五、方案 D:雲端 Secrets Manager(生產推薦)
AWS Secrets Manager
- 控制檯建立 Secret:Name =
prod/binance/main - Value = JSON:
{
"api_key": "X1uKq3...",
"api_secret": "abcDef...",
"created": "2026-04-14",
"rotation_days": 90
}
- IAM Role 繫結:只有
ec2-binance-bot這個例項角色可secretsmanager:GetSecretValue
Python 讀取:
import boto3
import json
sm = boto3.client('secretsmanager', region_name='ap-northeast-1')
resp = sm.get_secret_value(SecretId='prod/binance/main')
secrets = json.loads(resp['SecretString'])
API_KEY = secrets['api_key']
API_SECRET = secrets['api_secret']
成本:$0.40/Secret/月 + $0.05/萬次讀取。
HashiCorp Vault
# 寫入
vault kv put secret/binance/main \
api_key="X1uKq3..." \
api_secret="abcDef..."
# 讀取
vault kv get -format=json secret/binance/main
Python 讀取:
import hvac
client = hvac.Client(url='https://vault.company.com:8200', token=os.getenv('VAULT_TOKEN'))
resp = client.secrets.kv.v2.read_secret_version(path='binance/main')
API_KEY = resp['data']['data']['api_key']
API_SECRET = resp['data']['data']['api_secret']
GCP Secret Manager / Azure Key Vault
概念相同:建立 → IAM 授權 → SDK 讀取。選雲廠商時選你主要雲。
六、金鑰輪換策略
輪換節奏
| 場景 | 頻率 |
|---|---|
| 生產量化策略 | 每 90 天 |
| 測試網/紙單 | 每 180 天 |
| 第三方工具接入(TradingView 等) | 每 60 天 |
| 懷疑洩露 | 立即(小時級) |
| 員工離職 | 24 小時內 |
零停機輪換流程
Day 0 T+0h 建立 API Key #2(新)
Day 0 T+1h 把 #2 寫入 Secrets Manager
Day 0 T+2h 服務滾動更新,切到 #2
Day 0 T+3h 確認新 Key 工作正常
Day 0 T+24h 在幣安刪除舊 Key #1
雙 Key 並行 24 小時確保過渡,不會因一次性切換留下未完成訂單。
七、IP 白名單聯動
光存好 API Key 不夠,必須繫結 IP 白名單。
繫結步驟
- API Management → 編輯該 Key → Edit Restrictions
- 選 Restrict access to trusted IPs only
- 填入伺服器公網 IPv4/IPv6,最多 30 個
- 儲存 → 2FA 驗證
典型 IP 清單
# EC2 Tokyo 例項
54.248.xxx.xxx
54.248.xxx.yyy
# Google Cloud Taiwan
35.194.xxx.xxx
# Home Office(僅開發)
公共動態 IP(不推薦,用 VPN 出口 IP 更穩)
# IPv6
2406:da18:xxxx::1
白名單缺失的後果
不綁 IP 白名單時,幣安預設允許所有 IP 呼叫,只要 Key 洩露即全球可用。繫結 IP 白名單可把影響面從"全球"縮小到"你的 IP 段",即使 Key 被推 GitHub,攻擊者從自家網路也調不通。
八、審計日誌與應急響應
定期審計
幣安 API Management 頁面每個 Key 顯示:
- Last used: 最近一次呼叫時間
- Last IP: 最近呼叫 IP
- Total calls (24h): 24 小時呼叫量
若發現 Last IP 不是你的 IP 或 Total calls 突然飆升 10x,疑似異常。
應急響應清單
0-5 min: API Management → 刪除所有疑似洩露的 Key
5-15 min: Secrets Manager/Vault 裡替換為新 Key
15-30 min: 檢查所有正在執行的服務是否正常
30-60 min: 查最近 24 小時交易記錄/提幣記錄
60-120 min: 若有異常操作,提交客服工單凍結賬號
常見問題 FAQ
Q1: API Key 可以放在 CI/CD 環境變數裡嗎?
A: 可以但不推薦明文存在 GitHub Actions Secrets/GitLab CI Variables 裡。更好的方式是 CI 透過 OIDC 或 IAM Role 動態去 Secrets Manager 取,零明文落地。
Q2: Docker 容器如何安全注入 API Key?
A: 三種方式:① Docker secret(Swarm/K8s secret);② 啟動時 docker run -e 從 host 環境變數注入(host 本身用 Secrets Manager 解密);③ Sidecar 模式由另一個容器掛載 Vault agent 生成臨時 token。避免 ENV 寫在 Dockerfile。
Q3: 客戶端(桌面量化軟體)如何安全儲存 Key?
A: 用作業系統原生金鑰庫(Keychain/Credential Manager/libsecret)+ 軟體啟動時要求系統登入態。不要自己實現 AES 加密檔案,容易出 bug。
Q4: 已經推到 GitHub 的 Key 刪除提交就安全了嗎?
A: 不安全。GitHub 的 commit 歷史可透過 reflog 恢復,機器人在洩露後的 5 分鐘內就抓到。立即:① 幣安刪除洩露 Key;② 檢查資產;③ 用 git filter-repo 或 bfg-repo-cleaner 清理 Git 歷史;④ 輪換其他相關憑證。
Q5: 如何判斷 Key 洩露了?
A: 三個訊號:① 幣安 Last IP 不是你的;② 交易記錄出現未發起的訂單;③ 郵箱收到"API Key 頻繁呼叫"風控通知。發現任一立即刪除 Key。
繼續閱讀:回到 分類導航 進入「API接入」分類看簽名、限頻等教程。