Italiano

Strumenti per sviluppatori · SHA calcolatore hash

Certificato e impronte digitali SSH: come SHA-256 identifica una chiave pubblica

· Sfondo

sha-256 crittografia sicurezza

Richiesta chiave host SSH che mostra SHA256: impronta digitale con digest base64
Illustrazione vettoriale originale ToolAcre

Un'impronta digitale è un hash di un certificato o di una chiave, sufficientemente breve da poter essere letto ad alta voce. Questo post spiega come vengono calcolate le impronte digitali TLS e SSH, perché le impronte digitali SHA-1 vengono sostituite e cosa dimostra una corrispondenza.

La richiesta della chiave host che accetti sempre: cosa la riga SHA256: ti chiede di confrontare

Quando ti connetti a un server tramite SSH per la prima volta, viene visualizzato un messaggio che chiede se accettare la chiave host. Il prompt visualizza un'impronta digitale: `SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8` o simile. Questa impronta digitale è un hash della chiave pubblica del server. Ti viene chiesto di verificare fuori banda (al di fuori del protocollo SSH) di riconoscere questa chiave. La richiesta in genere mostra anche il tipo di chiave (RSA, ED25519, ECDSA) e il formato dell'impronta digitale. Se hai già visto l'impronta digitale di questa chiave attraverso un canale attendibile, puoi tranquillamente digitare "sì". In caso contrario, accettare significa confidare nella rete per fornire la chiave corretta.

Un'impronta digitale è semplicemente l'output di una funzione hash crittografica applicata alla chiave codificata. Per SSH, la chiave è codificata come un blob binario (il formato wire OpenSSH) e l'hash viene calcolato su quel blob. L'impronta digitale è più corta della chiave intera, rendendola leggibile e digitabile. Dalla stessa chiave risulterà sempre la stessa impronta digitale, quindi è possibile confrontare un'impronta digitale pubblicata in più luoghi o canali.

L'impronta digitale equivale all'hash della codifica: il certificato DER o il BLOB di chiave pubblica come input

Le chiavi host SSH e i certificati TLS sono codificati in modo diverso, ma il principio dell'impronta digitale è identico. Per SSH, l'impronta digitale viene calcolata dal materiale della chiave pubblica. Per i certificati TLS, l'impronta digitale viene calcolata dall'intero certificato (inclusi emittente, date di validità e altri campi). Quando ti connetti a un server web, il browser non mostra l'impronta digitale del certificato, perché TLS utilizza un modello di fiducia diverso: il browser si fida di un insieme di autorità di certificazione (CA) preinstallate e tali CA garantiscono il certificato. SSH non utilizza CA preinstallate; invece, ti fidi di chiavi specifiche e le memorizzi localmente in `~/.ssh/known_hosts`.

Poiché l'impronta digitale include tutti i byte del certificato per TLS, la modifica delle date di validità senza firmare nuovamente determina un'impronta digitale diversa. Per SSH, l'impronta digitale è solo quella della chiave pubblica, quindi l'impronta digitale è stabile finché la chiave non viene modificata.

Questa calcolatrice mostra le lunghezze SHA-1 e SHA-256; le raccomandazioni sulla politica delle impronte digitali richiedono fonti di protocollo

Storicamente, le impronte digitali SSH venivano visualizzate in MD5 esadecimale. MD5 è crittograficamente rotto e le collisioni sono pratiche. La community di sicurezza è passata alle impronte digitali SHA-256 come impostazione predefinita. Potresti ancora vedere entrambi i formati visualizzati dal tuo client SSH: `SHA256: base64` e `MD5: hex`. L'impronta digitale SHA-256 è quella di cui fidarsi per la verifica dell'identità. Se vedi entrambi, confronta la versione SHA-256 con un'impronta digitale proveniente da una fonte attendibile (il sito Web del server, un'e-mail firmata da un amministratore, un wiki interno). L'impronta digitale MD5 è meno affidabile perché esistono collisioni MD5.

Il cambiamento nel formato delle impronte digitali è un segno visibile della transizione crittografica. Le versioni precedenti di OpenSSH mostravano solo MD5. Le versioni moderne mostrano SHA-256 per impostazione predefinita. Il comando `ssh-keygen -l -f /path/to/key` visualizza l'impronta digitale della chiave nel formato predefinito per la tua versione di ssh-keygen; puoi forzare un formato specifico con il flag `-E` (ad esempio, `-E sha256` o `-E md5`).

SSH's base64 SHA256: formato: la modifica alla codifica che ha reso le impronte digitali più corte di quelle esadecimali

Le impronte digitali SSH base64 utilizzano un formato variante: hanno il prefisso con il nome dell'algoritmo e due punti, ad esempio `SHA256:base64string`. Questo è diverso dal formato di integrità delle risorse secondarie (SRI), che utilizza un trattino e include solo base64 standard. Il formato SSH include un'etichetta che rende inequivocabile quale algoritmo ha prodotto il digest. Quando vedi un'impronta digitale nell'output SSH, l'algoritmo viene sempre mostrato. Quando vedi un attributo di integrità SRI, l'algoritmo è codificato come prefisso con un trattino.

L'output base64 del calcolatore hash ToolAcre SHA è il formato standard; per far corrispondere le impronte digitali SSH, anteporre `SHA256: ` (nome dell'algoritmo, due punti e spazio). Il formato esadecimale della calcolatrice non è il formato visualizzato da SSH, sebbene rappresenti lo stesso digest ed è ugualmente valido a fini di verifica.

Ciò che dimostra una corrispondenza: che tu possiedi gli stessi byte di chiave pubblicati dall'altra parte e nulla sul proprietario della chiave senza un controllo fuori banda

Una corrispondenza dell'impronta digitale dimostra due cose: in primo luogo, che si possiedono gli stessi byte di chiave pubblicati dall'altra parte, e in secondo luogo, che né la chiave né l'impronta digitale sono state alterate da quando è stato calcolato il digest. Non dimostra l'identità del proprietario della chiave né autorizza alcuna azione specifica. La verifica di un'impronta digitale fuori banda è una condizione necessaria ma non sufficiente per fidarsi di una chiave. È inoltre necessario verificare che la persona che ha pubblicato l'impronta digitale sia chi afferma di essere.

In pratica, se un amministratore pubblica l'impronta SSH di un server sulla intranet aziendale o in una email firmata, puoi verificare che corrisponda alla richiesta che ricevi al momento della connessione. Se l'impronta digitale non corrisponde, puoi tranquillamente rifiutare la connessione perché qualcuno sta intercettando il tuo traffico o la chiave del server è cambiata. Se l'impronta digitale corrisponde, sai di avere la chiave giusta. Se quella chiave appartiene al server giusto è una domanda separata, alla quale puoi rispondere verificando il canale di pubblicazione (la pagina intranet sembra legittima? L'e-mail proviene effettivamente dall'account di quell'amministratore?).

Esempio pratico: verifica passo dopo passo di un'impronta digitale rispetto a quella pubblicata tramite un canale attendibile

Un'impronta digitale del certificato ha lo stesso scopo: identifica in modo univoco un certificato specifico. Se un server TLS modifica il proprio certificato (ad esempio durante il rinnovo), il nuovo certificato avrà un'impronta digitale diversa. Il blocco del certificato, ovvero l'hardcoding di un'impronta digitale o di un piccolo set di impronte digitali accettabili in un'applicazione, è una tecnica di sicurezza per rilevare le modifiche al certificato. Se il server presenta un certificato con un'impronta digitale diversa, l'applicazione lo rifiuta. Ciò protegge da una CA compromessa che emette un certificato fraudolento di cui il browser altrimenti si fiderebbe.

Il pinning del certificato richiede un'attenta gestione: se il server aggiorna il suo certificato e tu non lo avevi previsto, la tua applicazione rifiuterà il nuovo certificato valido. Molte applicazioni utilizzano invece il blocco della chiave pubblica, che blocca la chiave pubblica anziché l'intero certificato. Ciò consente il rinnovo del certificato senza rifiuto purché venga utilizzata la stessa chiave.

Esempio funzionante: verifica con strumenti compatibili con il protocollo perché gli hash ToolAcre hanno incollato UTF-8 testo, non DER o SSH byte wire

Calcolare manualmente un'impronta digitale per la verifica è semplice. Salva il certificato o la chiave in un file, utilizza `openssl dgst -sha256 filename` o `ssh-keygen -l -f filename -E sha256` per visualizzare l'impronta digitale e confrontarla con quella mostrata dal server. La calcolatrice hash ToolAcre SHA può anche calcolare il digest se incolli i byte chiave, ma ricorda che la calcolatrice esegue l'hashing del testo UTF-8 incollato, non dei file binari. Se la chiave è nel formato PEM (testo con intestazione `-----BEGIN CERTIFICATE-----` e byte con codifica base64), puoi incollarla nella calcolatrice. Se è in formato DER (binario), è necessario prima utilizzare gli strumenti da riga di comando o convertirlo in PEM.

Il confine è importante: ToolAcre hash UTF-8 testo che incolli nell'interfaccia della calcolatrice. Non legge i file dal tuo dispositivo (tutti i calcoli avvengono nel browser, nella tua scheda, senza rete). Se hai un file chiave su disco, puoi aprirlo in un editor di testo, copiare il testo e incollarlo nella calcolatrice se è in formato PEM. Oppure puoi utilizzare strumenti da riga di comando come `openssl`, `ssh-keygen` o `sha256sum` per calcolare l'hash localmente.

Conclusione: confronta le impronte digitali fuori banda: il calcolatore di hash ToolAcre SHA mostra come appaiono i digest SHA-1 e SHA-256 alla lunghezza utilizzata dalle impronte digitali

Il calcolatore hash ToolAcre SHA visualizza SHA-1 e SHA-256 digest per qualsiasi input di testo. Se incolli un certificato nel formato PEM o una chiave pubblica SSH, la calcolatrice calcola entrambi i digest. Per le chiavi SSH, la calcolatrice eseguirà l'hashing del testo incollato; se incolli il formato standard della chiave pubblica SSH con codifica base64, il digest non corrisponderà all'impronta digitale SSH perché SSH applica la propria formattazione (il formato wire) prima dell'hashing. Per una corrispondenza diretta, è necessaria la chiave nel formato esatto che SSH utilizza internamente, che non è il formato di visualizzazione pubblica.

Per le impronte digitali del certificato, il comportamento è simile: se si incolla il testo del certificato con codifica PEM, la calcolatrice esegue l'hashing di quel testo. L'impronta digitale di un certificato viene calcolata sui byte del certificato codificati (formato DER), non sul wrapper di testo PEM. I byte sono gli stessi, ma la codifica del testo è diversa. Per far corrispondere l'impronta digitale di un certificato da OpenSSL o dal visualizzatore di certificati del browser, dovresti fornire i byte DER, che non sono leggibili dall'uomo. Lo scopo della calcolatrice è quello di eseguire l'hashing del testo UTF-8 che puoi incollare e leggere, rendendo chiaro il confine: esegue l'hashing dell'input di testo, non dei file di chiavi crittografiche nelle loro forme binarie o di protocollo wire standard.