實際專案中,資料庫密碼、FTP 憑證、API Key 等敏感資訊不可明文寫入配置文件(.ini, .json, .yaml)。需在部署時加密、運行時解密,且不修改業務代碼邏輯。
Config.iniConfig.ini → 檢測加密標誌 → 解密 → 內存中得到明文 → 業務模塊使用iDecryptFlag=0 表示配置為密文(首次部署);=1 表示已解密(後續啟動跳過)// 簡單異或加密(生產環境請用 AES-256-GCM 等標準算法)
void xor_crypt(char *data, int len, const char *key, int keylen) {
for (int i = 0; i < len; i++) {
data[i] ^= key[i % keylen];
}
}
// 加密:明文 → Base64(密文) 存入配置
char* encrypt_password(const char *plain, const char *key) {
int len = strlen(plain);
char *buf = malloc(len + 1);
strcpy(buf, plain);
xor_crypt(buf, len, key, strlen(key));
char *b64 = base64_encode(buf, len); // 需實現或引用庫
free(buf);
return b64; // 調用者負責 free
}
// 解密:配置讀取 → Base64解碼 → 異或 → 明文
char* decrypt_password(const char *b64, const char *key) {
int len;
char *buf = base64_decode(b64, &len);
xor_crypt(buf, len, key, strlen(key));
buf[len] = '\0';
return buf;
}
Config.ini[Database] Host=127.0.0.1 Port=3306 User=app_user Password=U2FsdGVkX1+... # Base64 編碼的密文 Encrypted=1 # 1=已加密, 0=明文(首次部署時)


| 階段 | iDecryptFlag | 配置文件 Password 欄位 | 內存中實際值 |
|---|---|---|---|
| 首次部署 | 0 | 明文 mysecret | 明文 |
| 首次啟動 | 0→1 | 自動加密為密文 | 明文(解密後) |
| 後續啟動 | 1 | 密文 | 明文(解密後) |

memset_s 清零敏感緩衝區,mlock 防止換出到交換分區