tempo reale
Guardando il messaggio firmato, la ragione diventa molto ovvia. gpg --list-packets
prende l'input ed elenca tutti i pacchetti contenuti in un modo abbastanza leggibile:
$ echo "foo" | gpg --sign | gpg --list-packets
[gpg asking for passphrase]
:compressed packet: algo=1
:onepass_sig packet: keyid 8E78E44DFB1B55E9
version 3, sigclass 0x00, digest 2, pubkey 1, last=1
:literal data packet:
mode b (62), created 1421012528, name="",
raw data: 4 bytes
:signature packet: algo 1, keyid 8E78E44DFB1B55E9
version 4, created 1421012528, md5len 0, sigclass 0x00
digest algo 2, begin of digest 96 e3
hashed subpkt 2 len 4 (sig created 2015-01-11)
subpkt 16 len 8 (issuer key ID 8E78E44DFB1B55E9)
data: [4096 bits]
Il "pacchetto di dati letterali" e anche il "pacchetto di firma" contengono il timestamp di creazione, qui 1421012528
. I dati effettivi della firma tengono conto anche del timestamp di creazione del pacchetto di dati letterali, quindi saranno diversi per ogni firma calcolata.
faketime
Per verificarlo, usa il glorioso programma faketime
e calcola il checksum della firma (che è sempre lo stesso, indipendentemente dalla frequenza con cui esegui il comando):
faketime 5pm /bin/bash -c "echo "foo" | gpg --sign | sha256sum"