tiempo real
Mirando el mensaje firmado, la razón se vuelve muy obvia. gpg --list-packets
toma la entrada y enumera todos los paquetes contenidos de una manera algo legible:
$ 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]
El "paquete de datos literal" y también el "paquete de firma" contienen la marca de tiempo de creación, aquí 1421012528
. Los datos de firma reales también tienen en cuenta la marca de tiempo de creación del paquete de datos literal, por lo que también será diferente para cada firma calculada.
faketime
Para verificar esto, use el glorioso programa faketime
y calcule la suma de comprobación de la firma (que siempre es la misma, sin importar la frecuencia con la que ejecute el comando):
faketime 5pm /bin/bash -c "echo "foo" | gpg --sign | sha256sum"