objectif
Encoder et décoder du texte/fichiers en base64, sans retour à la ligne, avec variantes Linux et macOS, et gestion de l’URL-safe.
code minimal
# encoder une chaîne (sans newline à la fin)
printf '%s' 'secret' | base64 | tr -d '\n'
# décoder (Linux)
printf '%s' 'c2VjcmV0' | base64 -d
# décoder (macOS/BSD)
printf '%s' 'c2VjcmV0' | base64 -D
utilisation
# encoder un fichier en une seule ligne (portable Linux/macOS)
base64 < image.png | tr -d '\n' > image.png.b64
# décoder un fichier (Linux)
base64 -d < image.png.b64 > image.png
# décoder un fichier (macOS/BSD)
base64 -D < image.png.b64 > image.png
# Authorization: Basic (user:pass) sans fuite de newline
printf '%s' "$USER:$PASS" | base64 | tr -d '\n' | xargs -I{} echo "Authorization: Basic {}"
# hachage binaire puis encodage base64 (ex: digest SHA256 en base64)
openssl dgst -sha256 -binary < fichier.bin | base64 | tr -d '\n' > fichier.bin.sha256.b64
# URL-safe: remplacer +/ par -_ et retirer le padding (=)
printf '%s' 'payload' | base64 | tr -d '\n' | tr '+/' '-_' | sed 's/=*$//'
# décoder URL-safe (restaurer +/ et le padding) - Linux
val='cGF5bG9hZA'; pad=$(( (4 - ${#val} % 4) % 4 )); printf '%s' "$val" \
| sed 's/-/_/g; s/_/\//g' | awk -v p="$pad" '{printf "%s", $0; for(i=0;i<p;i++) printf "="}' \
| base64 -d
# écriture atomique lors du décodage
tmp="$(mktemp -p . .decode.XXXXXX)"; base64 -d < data.b64 > "$tmp" && mv -f "$tmp" data.bin
variante(s) utile(s)
# Linux: désactiver le wrapping sans tr (GNU base64)
printf '%s' 'secret' | base64 -w 0
# macOS/BSD: désactiver le wrapping sans tr
printf '%s' 'secret' | base64 -b 0
# vérifier qu'une entrée est du base64 plausible (caractères autorisés)
grep -Eq '^[A-Za-z0-9+/=]+$' <<< "$CANDIDATE" && echo "ok" || echo "ko"
# convertir un binaire en Data URI (image/png)
echo -n "data:image/png;base64," > out.uri
base64 < image.png | tr -d '\n' >> out.uri
notes
- base64 n’est pas un chiffrement; ne l’utilisez pas pour protéger des secrets.
- GNU (Linux) utilise
-dpour décoder et-w 0pour supprimer les retours à la ligne; macOS/BSD utilisent-Det-b 0. - retirez toujours les newlines avec
tr -d '\n'si l’outil insère des retours à la ligne. - pour l’URL-safe, remplacez
+//par-/_et supprimez le padding=; avant décodage, rétablissez-les et rajoutez le padding manquant.