Domande sulle variazioni delle chiavi RSA

2

Ho creato una semplice applicazione che legge una chiave RSA, controlla l'intestazione e avvia l'identificazione delle proprietà della chiave RSA per assicurarci che sia valida (utilizzando child_process in express per eseguire

$ openssl rsa -inform PEM -in ~/.ssh/id_rsa -check

Quindi, al di fuori di una chiamata di riposo dal mio server locale, posso controllare le intestazioni, supporre che sia codificata in base al codice base64, eseguire il dump nel terminale, verificare che sia coerente con la struttura corretta di una chiave.

Quando ho iniziato a vedere c'erano molti modi in cui la chiave RSA poteva entrare, sia PEM, DER, NET, speravo di ottenere una guida da alcuni esperti su quale sia la forma più probabile che hai ricevuto chiavi e modi in cui può essere usato per verificare la loro integrità o forse la loro struttura.

Considererei le chiavi per le date dopo il 2030 alla fine (quindi se una chiave da 2048 bit è passata potrei suggerire che la chiave sia resa a 4096 bit come alternativa più strong).

TL; DR - Di tutti i tipi di chiavi RSA tipicamente gestite, quali sono i formati principali utilizzati e quali sono alcuni potenziali approcci di convalida.

    
posta mcnichol 07.12.2015 - 06:29
fonte

2 risposte

2

I moduli comuni sono PKCS # 12 / PFX (una coppia di chiavi crittografate, possibilmente con certificati aggiuntivi) e PEM o DER modulo PKCS # 1 utilizzato da OpenSSL e OpenSSH (questo è quanto id_rsa sarà). PEM è una versione base64 del modulo DER binario (ASN.1) con l'identificazione di intestazione / piè di pagina, non è altrimenti una forma distinta, eccetto per il fatto che consente la crittografia dove non lo è il DER di PKCS # 1.

Se la chiave è crittografata (solo modulo PEM) conterrà linee di intestazione aggiuntive per indicare la crittografia e IV, ad esempio:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,AA171F6005B3DD31
...

PKCS # 1 è solo RSA, PKCS # 8 è un "contenitore" più generico per le chiavi, anch'esso è ASN.1 ma indica esplicitamente il tipo di dati all'interno, ad es (vedi offset 9, riga 4):

$ openssl pkcs8 -inform PEM -in ~/.ssh/id_rsa -topk8 -nocrypt \
  -outform DER -out id_rsa.p8 
$ dumpasn1 -tilda id_rsa.p8
 0 1213: SEQUENCE {
 4    1: . INTEGER 0
 7   13: . SEQUENCE {
 9    9: . . OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
       : . . . (PKCS #1)
20    0: . . NULL
       : . . }
22 1191: . OCTET STRING, encapsulates {
26 1187: . . SEQUENCE {
30    1: . . . INTEGER 0
33  257: . . . INTEGER    
       : . . . . 00 B1 1F 09 61 C1 A1 09    ....a...
 ...

(Sto usando dumpasn1 qui invece di openssl asn1parse , in modo imbarazzante, quest'ultimo non riesce a analizzare correttamente l'output pkcs8 .)

OpenSSH non (AFAIK) supporta PKCS # 8 tranne che per import / export, hanno il loro prodotto di caricamento . Questo formato viene utilizzato solo per i nuovi tipi di chiave (Ed25519), ma in futuro è pianificato come predefinito.

Ci sono alcune cose che puoi controllare utilmente:

  1. identificazione della riga di intestazione / piè di pagina in PEM e validità della codifica base64
  2. formato ASN.1 valido (principalmente limitato ai controlli di tipo e lunghezza)
  3. integrità numerica dei parametri RSA

Potresti anche riflettere su valore dell'esponente pubblico (troppo grande può causare problemi di interoperabilità, troppo piccolo è implicato con problemi di sicurezza per alcune applicazioni).

Il comando openssl rsa ... -check controlla 1 (solo PEM) e 2 implicitamente, e 3 esplicitamente. Per i dettagli dei controlli, consulta la documentazione di OpenSSL API RSA_check_key() . Questo dovrebbe essere un controllo sufficiente per la maggior parte, penso.

Un file di chiavi private RSA (quasi sempre) contiene oltre all'esponente della chiave privata, contiene anche i parametri della chiave pubblica e alcuni valori intermedi per l'ottimizzazione (tramite CRT ), questi valori possono essere verificati per coerenza o primato. La "dimensione della chiave" è la lunghezza del "modulo", con l'avvertenza che ci sarà (di solito) un che porta 00 byte per garantire che sia interpretato come un numero intero positivo (problema di notifica ASN.1).

Per una vista diversa puoi anche fare:

openssl asn1parse -inform PEM -in ~/.ssh/id_rsa

(ma questo non controlla i parametri RSA)

    
risposta data 02.12.2016 - 18:34
fonte
0

Esistono alcuni standard che trattano questo argomento:

  • PKCS # 8 riguarda la memorizzazione della chiave privata.
  • PKCS # 11 riguarda le API utilizzate da software crittografico.
  • PKCS # 12 riguarda un formato di archivio per molti oggetti di crittografia in un singolo file.
  • PKCS # 7 l'RFC2315 è anche una buona fonte di informazioni. Riguarda il modo in cui i PKI funzionano con la firma / la crittografia.
  • PKCS Wikipedia ha una buona panoramica sull'argomento.

In breve, il panorama delle chiavi e dei certificati è troppo ampio per darti una risposta specifica. Tutto quello che posso fare è darti questa lista di ulteriori argomenti di studio per farti arrivare sulla tua strada.

    
risposta data 07.12.2015 - 11:28
fonte

Leggi altre domande sui tag