Seed de la chaine

Le seed de la chaine est une valeur secrete utilisee pour calculer le hash de genese — le prev_hash de la toute premiere entree dans la chaine d'audit. Un seed fort et imprévisible garantit qu'un attaquant ne peut pas reconstituer la chaine de zero.

Fonctionnement du hash de genese

Lorsqu'AuditChain enregistre la premiere entree du journal d'audit, il a besoin d'un prev_hash auquel se rattacher. Comme il n'y a pas d'entree precedente, il le derive du seed de la chaine :

genesis_hash = SHA-256(chain_seed)

Chaque entree suivante se rattache a la precedente :

Entry #1: prev_hash = SHA-256(chain_seed)     hash = SHA-256(data + prev_hash)
Entry #2: prev_hash = hash of Entry #1        hash = SHA-256(data + prev_hash)
Entry #3: prev_hash = hash of Entry #2        hash = SHA-256(data + prev_hash)

Le hash de genese ancre l'ensemble de la chaine. Si un attaquant connait le seed, il peut recalculer le hash de genese et forger une chaine de remplacement depuis le debut.

Configuration

Le seed est configure via la cle chain_seed dans config/audit-chain.php :

'chain_seed' => env('AUDIT_CHAIN_SEED', 'genesis'),

La valeur par défaut est 'genesis' — un placeholder prévisible qui convient pour le développement mais doit etre remplace en production. Lorsque le seed par défaut est utilise, AuditChain emet un Log::warning() a chaque enregistrement de log chaine pour vous rappeler de definir un seed securise.

Definir un seed securise

Ajoutez AUDIT_CHAIN_SEED a votre fichier .env avec une valeur aleatoire a haute entropie :

AUDIT_CHAIN_SEED=your-random-secret-value-here

Generer une valeur securisee

Utilisez le Tinker de Laravel pour generer une chaine aleatoire de 64 caracteres :

php artisan tinker --execute="echo Str::random(64);"

Ou utilisez OpenSSL en ligne de commande :

openssl rand -hex 32

Les deux approches produisent une valeur avec une entropie suffisante.

Pourquoi un seed prévisible est dangereux

Si le seed de la chaine est laisse a la valeur par défaut 'genesis' (ou toute autre valeur devinable), un attaquant qui obtient un acces en ecriture a la table d'audit peut :

  1. Calculer lui-meme le hash de genese (SHA-256('genesis')).
  2. Supprimer tous les journaux d'audit existants.
  3. Inserer une chaine forgee qui commence par le meme hash de genese.
  4. La chaine forgee passe audit:verify car les hash sont internement coherents.

Avec un seed secret, l'etape 1 echoue — l'attaquant ne peut pas calculer le hash de genese correct, donc toute chaine forgee se rompra au premier maillon lors de la verification.

Considerations importantes

Definissez le seed avant d'enregistrer tout journal d'audit. Le hash de genese est calcule au moment ou la premiere entree est enregistree. Modifier le seed apres l'existence d'entrees fera echouer audit:verify sur la premiere entree, puisque la verification recalcule le hash de genese a partir du seed actuel.

Stockez le seed de maniere securisee. Traitez AUDIT_CHAIN_SEED comme tout autre secret applicatif. Conservez-le dans votre fichier .env (qui ne doit jamais etre commite dans le controle de version) ou dans un gestionnaire de secrets.

Utilisez un seed unique par environnement. Vos environnements de production, de staging et local doivent chacun avoir leur propre valeur de seed. Cela empeche les donnees d'audit copiees entre environnements d'apparaitre comme valides.

Ne faites pas de rotation du seed. Contrairement aux cles de chiffrement, le seed de la chaine n'est pas prevu pour etre change. Le modifier invalide la chaine a partir de la toute premiere entree. Si le seed est compromis, vous devez evaluer l'etendue de la compromission et decider s'il faut re-initialiser la chaine.