objectif
Générer rapidement des secrets forts pour des variables d’environnement (JWT, API keys, sessions) sans recourir à des générateurs faibles.
code minimal
# 32 octets aléatoires (256 bits) en hex
openssl rand -hex 32
# 32 octets en base64 (sans newline)
openssl rand -base64 32 | tr -d '\n'
# 32 octets URL-safe (base64url sans padding)
openssl rand -base64 32 | tr -d '\n' | tr '+/' '-_' | sed 's/=*$//'
utilisation
# écrire dans un fichier .env de façon sûre (création si absent)
SECRET="$(openssl rand -base64 32 | tr -d '\n')"
umask 077
{ grep -v '^APP_SECRET=' .env 2>/dev/null || true; echo "APP_SECRET=$SECRET"; } > .env.tmp && mv -f .env.tmp .env
# générer plusieurs secrets nommés et les afficher
for name in JWT_SECRET API_KEY SESSION_KEY; do
printf '%s=%s\n' "$name" "$(openssl rand -hex 32)"
done
# injecter un secret directement dans une commande (ex: docker run)
docker run -e "APP_KEY=$(openssl rand -base64 32 | tr -d '\n')" myimage:latest
# créer un token court lisible pour un lien unique (12 octets = 16 chars base64url)
TOKEN="$(openssl rand -base64 12 | tr -d '\n' | tr '+/' '-_' | sed 's/=*$//')"
echo "$TOKEN"
variante(s) utile(s)
# longueur contrôlée (N octets -> 2N chars en hex, ~4/3*N en base64)
BYTES=48
openssl rand -hex "$BYTES"
openssl rand -base64 "$BYTES" | tr -d '\n'
# format JSON prêt à consommer
jq -n --arg key "$(openssl rand -hex 32)" '{app_key:$key}'
# fallback portable sans openssl (Python 3)
python3 - <<'PY'
import secrets, base64, sys
print("HEX:", secrets.token_hex(32))
print("B64URL:", base64.urlsafe_b64encode(secrets.token_bytes(32)).rstrip(b"=").decode())
PY
# vérifier l'entropie approximative (nombre unique sur 1000 tentatives)
count=$(for _ in $(seq 1 1000); do openssl rand -hex 32; done | sort | uniq -c | wc -l); echo "$count/1000 uniques"
notes
- n’utilisez pas
$RANDOM,date +%s,uuidgenou des générateurs pseudo-aléatoires non cryptographiques pour des secrets. - 32 octets (256 bits) conviennent à la majorité des usages (JWT HS256, cookies de session, API keys). Adaptez selon les exigences.
- retirez les retours à la ligne ajoutés par certaines commandes (
tr -d '\n') avant d’insérer en env/headers. - pour un usage dans des URLs, utilisez la variante base64url sans padding.