hm, tohle je dost velká prasárna, nikdy jsem se s tím zatím nesetkal, je ale pravda, že velké archivy s openssl nešifruji snad nikde, všude je gpg či jiný nástroj či formát. Dobré vědět!
Jake jine nastroje krome gpg pouzivas?
zip
, jinak sám třeba age (ano, je to poslehlivý zajímavý projekt jak šifrovat, stojí za ním Filippo Valsorda, což je osoba s mnoha lety zkušeností na poli kryptografie, dělal v cloudlflare, měl na starosti šifrování v go), na freebsd enigma/crypt. U klientů často enterprise grade nástroje. Openssl jsem si vůbec neoblíbil.
Přidej si tam ty checksumy, hned by ti to spadlo na validaci, protože rozbalený šifrovaný archiv by měl jiný checksum než originál. Jak psal Filip, checksum si ukládej vedle do souboru. Vyhneš se všem těmhle hidden truncate problémům nebo třeba OOM chybě při šifrování.
Jak s temi checksumy? Protoze si neumim moc predstavit, jak je pouzit, pokud pouziju roury. Protoze bez vyuziti rour bych nejdrive ulozil na disk komprimovany dump (=X write iops, size Y), pak checksum, pak vytvorit sifrak (+ X read, +X write, +Y size), pak otestovat?? desifrovanim...no vychazi mi z toho mnohem vetsi narocnost na diskovou kapacitu a vykon nez u rour. Asi mi neco uchazi...
No, nejlepší je to prostě uložit bokem, udělat checksum a pak další operace. Nebudeš muset totiž řešit situaci, kdy ti procesy spadnou a zůstane ti tam poloviční archiv. Když to nechceš opravdu řešit přes roury, tak aspoň s pipefail, checksum můžeš vypočít streamovaně přes tee, dešifrování a druhému přečtení se nevyhneš, to je ale logické.
# důležité je nastavit pipefail pro bash
set -euo pipefail
# lehce můžeš upravit tvoje roury
/usr/bin/pg_dump --create --exclude-schema=XX --exclude-schema=XY "$line"| tee >(sha256sum > "${PDIR}/${line}_${OFP}.sha256") | gzip -c | openssl smime...
# pak backup dešifrovat a přečíst, tomu se stejně tak nevyhneš
backup_checksum="$(openssl smime -decrypt ... | gzip -d | sha256sum)"
# můžeš provést kontrolu, v obou případěch je filename "-", takže můžeme přímo porovnat
if [[ "$(cat "${PDIR}/${line}_${OFP}.sha256")" != "$backup_checksum" ]]; then
>&2 echo "checksum mismatch for ${PDIR}/${line}_${OFP}"
exit 1
fi