← retour aux snippets

openssl: générer des secrets aléatoires sécurisés

Créer des clés API et mots de passe cryptographiquement sûrs (hex, base64, URL-safe).

bash sécurité #openssl#secrets#cli

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, uuidgen ou 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.