mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
403ceb39be
## Config field fixes (cross-verified against Go source) - MaixCam: server_address → host + port - IRC: use_tls → tls, channels_to_join → channels (all 6 languages) - WeCom AI Bot: callback port 18791 → 18790 - credential_encryption: base_url → api_base, add required model field, remove incorrect passphrase-only mode docs - providers.md: agents.defaults.model → model_name (×4), remove non-existent session.backlog_limit - migration guide, troubleshooting: agents.defaults.model → model_name - ANTIGRAVITY_AUTH: fix file path, Go 1.21 → 1.25, model → model_name - spawn-tasks: fix truncated file, add Heartbeat introduction - tools_configuration: add Tavily/SearXNG/GLMSearch, exec allow_remote/ timeout_seconds/custom_allow_patterns, cron allow_command, skills github/search_cache, clawhub timeout/max_zip_size/max_response_size - configuration: fix builtin skills path (build-time embedded, not cwd), HEARTBEAT.md marked auto-generated ## Broken link fixes (15 total) - chat-apps.md: WeCom/Matrix links with wrong relative paths - providers.md: migration link with extra docs/ prefix - hardware-compatibility.md: README links with wrong depth (all 5 langs) - chat-apps.md: WhatsApp dead links → anchor links (zh/ja) ## Getting-started accuracy - README (all 6 langs): add picoclaw.io as recommended download, add missing picoclaw model CLI command - docker.md: clarify first-run trigger condition (all 6 langs) - configuration.md: fix builtin skills path description (all 6 langs) ## QQ channel - Add quick setup via q.qq.com/qqbot/openclaw (one-click bot creation) - Add manual setup as fallback (all 6 languages) ## Feishu channel - Update setup flow: WebSocket/SDK mode, no webhook URL needed - Preserve Lark international domain note (all 6 languages) ## chat-apps.md - Add Feishu, Slack, IRC, OneBot detail sections (all 6 languages) - Add MaixCam section to ja/fr/pt-br/vi - Fix all channel doc links to point to correct language version ## New translations (25 files, 5 docs × 5 languages) debug.md, credential_encryption.md, hardware-compatibility.md, ANTIGRAVITY_AUTH.md, ANTIGRAVITY_USAGE.md → zh/ja/fr/pt-br/vi ## Channel docs (6 languages each, 60 new files) telegram, discord, qq, feishu, maixcam, dingtalk, line, slack, onebot, wecom/wecom_aibot, wecom/wecom_app, wecom/wecom_bot Co-authored-by: BeaconCat <BeaconCat@users.noreply.github.com>
160 lines
5.8 KiB
Markdown
160 lines
5.8 KiB
Markdown
> Retour au [README](../../README.fr.md)
|
|
|
|
# Chiffrement des identifiants
|
|
|
|
PicoClaw prend en charge le chiffrement des valeurs `api_key` dans les entrées de configuration `model_list`.
|
|
Les clés chiffrées sont stockées sous forme de chaînes `enc://<base64>` et déchiffrées automatiquement au démarrage.
|
|
|
|
---
|
|
|
|
## Démarrage rapide
|
|
|
|
**1. Définir votre phrase secrète**
|
|
|
|
```bash
|
|
export PICOCLAW_KEY_PASSPHRASE="your-passphrase"
|
|
```
|
|
|
|
**2. Chiffrer une clé API**
|
|
|
|
Exécutez `picoclaw onboard` — il vous demande votre phrase secrète et génère la clé SSH,
|
|
puis re-chiffre automatiquement toutes les entrées `api_key` en clair dans votre configuration
|
|
lors du prochain appel à `SaveConfig`. La valeur `enc://` résultante ressemblera à :
|
|
|
|
```
|
|
enc://AAAA...base64...
|
|
```
|
|
|
|
**3. Coller la sortie dans votre configuration**
|
|
|
|
```json
|
|
{
|
|
"model_list": [
|
|
{
|
|
"model_name": "gpt-4o",
|
|
"model": "openai/gpt-4o",
|
|
"api_key": "enc://AAAA...base64...",
|
|
"api_base": "https://api.openai.com/v1"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Formats `api_key` pris en charge
|
|
|
|
| Format | Exemple | Comportement |
|
|
|--------|---------|--------------|
|
|
| Texte clair | `sk-abc123` | Utilisé tel quel |
|
|
| Référence fichier | `file://openai.key` | Contenu lu depuis le même répertoire que le fichier de configuration |
|
|
| Chiffré | `enc://<base64>` | Déchiffré au démarrage avec `PICOCLAW_KEY_PASSPHRASE` |
|
|
| Vide | `""` | Transmis tel quel (utilisé avec `auth_method: oauth`) |
|
|
|
|
---
|
|
|
|
## Conception cryptographique
|
|
|
|
### Dérivation de clé
|
|
|
|
Le chiffrement utilise **HKDF-SHA256** avec une clé privée SSH comme second facteur.
|
|
|
|
```
|
|
sshHash = SHA256(ssh_private_key_file_bytes)
|
|
ikm = HMAC-SHA256(key=sshHash, message=passphrase)
|
|
aes_key = HKDF-SHA256(ikm, salt, info="picoclaw-credential-v1", 32 bytes)
|
|
```
|
|
|
|
### Chiffrement
|
|
|
|
```
|
|
AES-256-GCM(key=aes_key, nonce=random[12], plaintext=api_key)
|
|
```
|
|
|
|
### Format de transmission
|
|
|
|
```
|
|
enc://<base64( salt[16] + nonce[12] + ciphertext )>
|
|
```
|
|
|
|
| Champ | Taille | Description |
|
|
|-------|--------|-------------|
|
|
| `salt` | 16 octets | Aléatoire par chiffrement ; fourni à HKDF |
|
|
| `nonce` | 12 octets | Aléatoire par chiffrement ; IV AES-GCM |
|
|
| `ciphertext` | variable | Texte chiffré AES-256-GCM + tag d'authentification de 16 octets |
|
|
|
|
Le tag d'authentification GCM est automatiquement ajouté au texte chiffré. Toute altération provoque l'échec du déchiffrement avec une erreur plutôt que de retourner un texte clair corrompu.
|
|
|
|
### Performance
|
|
|
|
| Opération | Durée (ARM Cortex-A) |
|
|
|-----------|----------------------|
|
|
| Dérivation de clé (HKDF) | < 1 ms |
|
|
| Déchiffrement AES-256-GCM | < 1 ms |
|
|
| **Surcoût total au démarrage** | **< 2 ms par clé** |
|
|
|
|
---
|
|
|
|
## Sécurité à deux facteurs avec clé SSH
|
|
|
|
Lorsqu'une clé privée SSH est fournie, casser le chiffrement nécessite **les deux** :
|
|
|
|
1. La **phrase secrète** (`PICOCLAW_KEY_PASSPHRASE`)
|
|
2. Le **fichier de clé privée SSH**
|
|
|
|
Cela signifie qu'un fichier de configuration divulgué seul ne suffit pas pour récupérer la clé API, même si la phrase secrète est faible. La clé SSH apporte 256 bits d'entropie (Ed25519) indépendamment de la force de la phrase secrète.
|
|
|
|
### Modèle de menace
|
|
|
|
| Ce que l'attaquant possède | Peut-il déchiffrer ? |
|
|
|---------------------------|---------------------|
|
|
| Fichier de configuration uniquement | Non — nécessite la phrase secrète + la clé SSH |
|
|
| Clé SSH uniquement | Non — nécessite la phrase secrète |
|
|
| Phrase secrète uniquement | Non — nécessite la clé SSH |
|
|
| Fichier de configuration + clé SSH + phrase secrète | Oui — compromission totale |
|
|
|
|
---
|
|
|
|
## Variables d'environnement
|
|
|
|
| Variable | Requis | Description |
|
|
|----------|--------|-------------|
|
|
| `PICOCLAW_KEY_PASSPHRASE` | Oui (pour `enc://`) | Phrase secrète utilisée pour la dérivation de clé |
|
|
| `PICOCLAW_SSH_KEY_PATH` | Non | Chemin vers la clé privée SSH. Si non défini, détection automatique depuis `~/.ssh/picoclaw_ed25519.key` |
|
|
|
|
### Détection automatique de la clé SSH
|
|
|
|
Si `PICOCLAW_SSH_KEY_PATH` n'est pas défini, PicoClaw recherche la clé dédiée :
|
|
|
|
```
|
|
~/.ssh/picoclaw_ed25519.key
|
|
```
|
|
|
|
Ce fichier dédié évite les conflits avec les clés SSH existantes de l'utilisateur.
|
|
Exécutez `picoclaw onboard` pour le générer automatiquement.
|
|
|
|
`os.UserHomeDir()` est utilisé pour la résolution multiplateforme du répertoire personnel (lit `USERPROFILE` sous Windows, `HOME` sous Unix/macOS).
|
|
|
|
> **Remarque :** Un fichier de clé SSH est requis pour le chiffrement des identifiants. Si aucune clé n'est trouvée et que `PICOCLAW_SSH_KEY_PATH` n'est pas défini, le chiffrement/déchiffrement échouera. Exécutez `picoclaw onboard` pour générer la clé automatiquement.
|
|
|
|
---
|
|
|
|
## Migration
|
|
|
|
Étant donné que les seuls éléments secrets sont `PICOCLAW_KEY_PASSPHRASE` et le fichier de clé privée SSH, la migration est simple :
|
|
|
|
1. Copiez le fichier de configuration sur la nouvelle machine.
|
|
2. Définissez `PICOCLAW_KEY_PASSPHRASE` avec la même valeur.
|
|
3. Copiez le fichier de clé privée SSH au même chemin (ou définissez `PICOCLAW_SSH_KEY_PATH` vers son nouvel emplacement).
|
|
|
|
Aucun re-chiffrement n'est nécessaire.
|
|
|
|
---
|
|
|
|
## Considérations de sécurité
|
|
|
|
- **La phrase secrète et la clé SSH sont toutes deux requises.** La clé SSH agit comme un second facteur — sans elle, le chiffrement/déchiffrement échouera. Exécutez `picoclaw onboard` pour générer la clé si elle n'existe pas.
|
|
- **La clé SSH est en lecture seule à l'exécution.** PicoClaw n'écrit ni ne modifie jamais le fichier de clé SSH.
|
|
- **Les clés en texte clair restent prises en charge.** Les configurations existantes sans `enc://` ne sont pas affectées.
|
|
- **Le format `enc://` est versionné** via le champ `info` de HKDF (`picoclaw-credential-v1`), permettant de futures mises à niveau d'algorithme sans casser les valeurs chiffrées existantes.
|