
# Crypto et digest

Deux petites familles qui résolvent deux problèmes sans rapport : prouver qu'une charge utile n'a pas été altérée, et transformer un flot d'événements en un message qu'un humain lira vraiment.

## Crypto — Hachage et HMAC

Deux opérateurs, qui calculent des empreintes et des signatures — typiquement pour vérifier un webhook entrant ou signer un webhook sortant.

| Opérateur | Propriétés                                  | Description                                                    |
| --------- | ------------------------------------------- | -------------------------------------------------------------- |
| `hash`    | `input`, `algorithm`, `encoding?`           | Hache avec `md5` / `sha256` / `sha512`.                        |
| `hmac`    | `input`, `secret`, `algorithm`, `encoding?` | HMAC à clé avec `sha256` / `sha512`, clé fournie par `secret`. |

`algorithm` est **obligatoire** sur les deux. `encoding` vaut `hex` (par défaut) ou `base64` sur les deux.

```yaml
- name: signPayload
  type: crypto
  operator: hmac
  props:
    input: '{{trigger.data.body}}'
    secret: $env.SIGNING_SECRET
    algorithm: sha256
    encoding: hex
```

:::callout
**`hmac` n'accepte pas `md5`.** Son énumération d'algorithmes se limite à `sha256` et `sha512`, tandis que `hash` accepte encore `md5` pour l'interopérabilité avec des systèmes anciens. Ne recourez jamais à `md5` pour une signature sur laquelle vous vous appuyez.
:::

Gardez la clé dans l'environnement (`$env.SIGNING_SECRET`), jamais en clair dans la configuration — celle-ci est du code, et elle part vers un dépôt distant.

## Digest — Regroupement et libération

Deux opérateurs qui collectent des éléments sur de nombreuses exécutions dans un seau nommé, puis les vident en un seul lot. L'usage classique est le regroupement de notifications : une automatisation collecte chaque événement à mesure, une seconde les libère selon une planification.

| Opérateur | Propriétés                            | Description                                                               |
| --------- | ------------------------------------- | ------------------------------------------------------------------------- |
| `collect` | `digestKey`, `item`, `deduplicateBy?` | Ajoute un élément à un seau nommé, avec déduplication optionnelle.        |
| `release` | `digestKey`, `sort?`, `limit?`        | Vide un seau — éventuellement trié (`{ field, direction? }`) et plafonné. |

`digestKey` est **obligatoire** sur les deux opérateurs et c'est lui qui apparie un producteur à son consommateur. `sort.direction` vaut `asc` par défaut.

```yaml
# Producer automation (record trigger) collects
- name: queueDigest
  type: digest
  operator: collect
  props:
    digestKey: daily-summary
    item: '{{trigger.data.record}}'
    deduplicateBy: id

# Consumer automation (cron trigger) releases
- name: drain
  type: digest
  operator: release
  props:
    digestKey: daily-summary
    sort: { field: created_at, direction: desc }
    limit: 50
```

:::callout
**La propriété est `digestKey`, pas `bucket`.** Une action digest écrite avec `bucket:` échoue à l'exécution avec `digest.collect requires a digestKey`. Le nom n'a aucun rapport avec les [buckets](/fr/docs/buckets-overview) de stockage, qui contiennent des fichiers.
:::

Deux exécutions, pas une : `collect` appartient à une automatisation déclenchée par l'événement (un [déclencheur d'enregistrement](/fr/docs/trigger-record-comment)), et `release` à une automatisation déclenchée par l'horloge (un [déclencheur cron](/fr/docs/trigger-webhook-cron)). Comme `release` vide le seau, celui-ci repart vide pour la fenêtre suivante — une planification manquée accumule donc au lieu de perdre des événements.

## Pages connexes

- [Données et état](/fr/docs/automation-data-actions) — les familles `data`, `state` et `filter`.
- [Déclencheurs webhook et cron](/fr/docs/trigger-webhook-cron) — la signature entrante vérifiée par `hmac`, et la planification qui pilote `release`.
- [Actions e-mail](/fr/docs/automation-email-actions) — envoyer le lot qu'un digest libère.
- [Actions HTTP et webhooks](/fr/docs/automation-http-actions) — signer une requête sortante.
- [Variables d'environnement](/fr/docs/env-vars) — d'où vient `$env.SIGNING_SECRET`.
