Come rilevare se una chiave privata GnuPG ha passphrase su di essa da uno script?

2

Ho scritto uno script per aiutare i nostri sviluppatori a memorizzare una copia delle loro chiavi private senza una passphrase all'interno del nostro albero Marionetta (non impegnata in Git) così le nostre caselle di Vagrant possono usare Hiera con eyaml + gpg ( link ) per accedere ai dati segreti durante il test.

Lo script funziona alla grande, ma mi piacerebbe anche automatizzare il processo di verifica che la chiave segreta sia stata rimossa in modo corretto da una passphrase nella copia.

Finora, l'unico modo che ho trovato è manuale - esegui gpg --homedir ... --edit-key keyid e poi nel prompt interattivo esegui password e cerca un messaggio This key is not protected. .

Mi piacerebbe farlo automaticamente nello script - in pratica voglio sapere come fa lo strumento gpg a sapere che dovrebbe stampare questo messaggio. Dalla risposta in link e leggendo il codice sorgente di GnuPG in g10 / export.c I Concludiamo che "nessuna passphrase" è in realtà considerata come "passphrase è una stringa vuota" e il codice tenta effettivamente di decodificare una stringa casuale con la passphrase e verificare che il risultato contenga pattern random ripetuti.

È corretto?

Se è così - c'è un modo per evitare di dover implementare di nuovo l'intero processo, ma invece utilizzare lo strumento a riga di comando gpg o alcune API Python / Ruby per farlo? Ho guardato alcuni front-end Python e Ruby su gpgme ma non ho visto qualcosa di simile lì.

Vedo in g10 / build-packet.c che dovrei aspettarmi un output diverso se il pacchetto è protetto o meno, ma provare a confrontare i dump delle chiavi segrete protette e non protette non ha funzionato t produrre qualsiasi cosa tranne piccole differenze di hash. Potrei interpretare male il codice lì.

    
posta Amos Shapira 09.10.2015 - 04:17
fonte

1 risposta

2

Dai miei test, gpg --list-packets genererà risultati diversi a seconda che la chiave sia crittografata o meno. Una chiave generata senza passphrase avrà direttamente informazioni sulla chiave rivelate:

:secret key packet:
    version 4, algo 1, created 1444376378, expires 0
    skey[0]: [1024 bits]
    skey[1]: [17 bits]
    skey[2]: [1017 bits]
    skey[3]: [512 bits]
    skey[4]: [512 bits]
    skey[5]: [510 bits]
    checksum: 9df4
    keyid: [snip]

mentre una chiave con passphrase fornisce solo informazioni sulle parti chiave pubbliche e sulle procedure stringa-chiave in uso:

:secret key packet:
        version 4, algo 1, created 1378729401, expires 0
        skey[0]: [1024 bits]
        skey[1]: [17 bits]
        iter+salt S2K, algo: 3, SHA1 protection, hash: 10, salt: e182c39f07747f0c
        protect count: 65011712 (255)
        protect IV:  d5 0d 20 dc cb a2 e9 16
        encrypted stuff follows
        keyid: 99543578D453449B

Dovresti comunque analizzare l'output, ma questo dovrebbe essere abbastanza stabile per andare direttamente all'assenza di una riga [whatever] S2K (ci sono diverse procedure S2K, quindi assicurati di recuperarle tutte o usare un qualche tipo di wild carta). Purtroppo non esiste uno speciale --with-colons di output per --list-packets che sarebbe più semplice e più affidabile da analizzare.

    
risposta data 09.10.2015 - 09:50
fonte

Leggi altre domande sui tag