Le applicazioni web moderne gestiscono vaste quantità di dati sensibili, dalle identità personali e dalle informazioni finanziarie alle comunicazioni commerciali riservate, rendendo la crittografia robusta uno strato non negoziabile di difesa. Mentre Transport Layer Security (TLS) crittografa i dati in transito, la crittografia a livello di applicazione fornisce una crittografia extra, assicurando che anche se TLS è compromessa, i dati rimangono intelligibili per parti non autorizzate.

Comprendere Crittografia Asimmetrica: Principi fondamentali e Varianti moderni

Il segreto pubblico viene utilizzato per crittografare i dati, mentre la chiave privata corrispondente lo decifra. Anche se un attaccante intercetta la chiave pubblica e il messaggio crittografato, non possono recuperare il testo in chiaro senza la chiave privata. Questo consente a qualsiasi parte di inviare informazioni riservate al portachiavi senza richiedere uno scambio preventivo di segreti.

La sicurezza di crittografia asimmetrica si basa sulla difficoltà matematica di alcuni problemi. Gli algoritmi più utilizzati rientrano in due famiglie principali: RSA (Rivest–Shamir–Adleman) e Elliptic Curve Cryptography] (ECC). RSA, inventato nel 1977, è basato su risorse

È fondamentale capire che la crittografia asimmetrica è non una sostituzione per la crittografia simmetrica]. Le operazioni asimmetriche sono computazionalmente costose e possono solo crittografare i dati fino a un limite di dimensione determinato dalla lunghezza chiave (ad esempio, RSA-2048 può crittografare al massimo 245 byte).

Quando utilizzare la crittografia asimmetrica nella tua applicazione Web

La crittografia asimmetrica è ideale per diversi casi di utilizzo specifici nelle applicazioni web:

  • Invio dei dati:[ Quando un client (browser, app mobile o servizio di terze parti) invia dati sensibili al server, crittografandolo con la chiave pubblica del server assicura che solo il server possa leggerlo, anche se lo strato TLS è compromesso o i dati sono registrati in un proxy intermedio.
  • Messaggi crittografati end-to-end:[] Con la generazione di coppie chiave per ogni utente e la distribuzione di chiavi pubbliche tramite una directory di fiducia, è possibile costruire un sistema di messaggistica crittografato dove solo il destinatario previsto può decifrare i messaggi.
  • Firme digitali e autenticazione:[] Utilizzando la chiave privata per firmare i dati (ad esempio, una richiesta JWT o API) i destinatari possono verificare l'autenticità e l'integrità con la chiave pubblica corrispondente.
  • Secure key Exchange:[[] La crittografia asimmetrica viene utilizzata per avviare le chiavi simmetriche nei protocolli come TLS 1.3. Nella tua applicazione, puoi usarlo per scambiare in modo sicuro le chiavi di crittografia per le successive operazioni simmetriche.
  • Protezione di segreti memorizzati:[ Per la comunicazione server-to-server o quando si memorizzano i dati di configurazione crittografati, la crittografia asimmetrica può garantire segreti a riposo, con accesso controllato da possesso della chiave privata.

Guida all'attuazione passo-passo

1. Generare un forte coppia di chiavi

Il metodo che scegli dipende dall'ambiente del tuo server. Per la maggior parte delle applicazioni web, OpenSSL] è lo strumento standard. È possibile generare una chiave privata RSA-2048 con:

apresl genpkey -algorithm RSA -out private key.pem -pkeyopt rsa keygen bits:2048

Quindi estrarre la chiave pubblica:

apre rsa -pubbout -in privato key.pem -out public key.pem

In alternativa, per ECC (consigliato per l'efficienza), utilizzare:

Apre il nome di primo256v1 -out ec private key.pem[
openssl ec -pubout -in ec private key.pem -out ec public key.pem

In un ambiente Node.js, è possibile generare chiavi programmaticamente utilizzando il modulo incorporato :

const {generaKeyPairSync } = richiedono('crypto');
const { publicKey, privateKey } = generareKeyPairSync('rsa', { modulusLength: 2048 });

Nel browser, l'API Web Crypto fornisce sia RSA che ECC, ma le chiavi generate nel browser rimangono nella memorizzazione sicura del browser e non possono essere facilmente esportate sul server. Per la maggior parte degli scenari di applicazione web, le chiavi devono essere generate e gestite lato server, con solo la chiave pubblica esposta ai client.

2. Esponere la chiave pubblica ai clienti

I clienti hanno bisogno di accedere alla chiave pubblica per crittografare i dati prima della presentazione. Ci sono diversi modi sicuri per distribuirlo:

  • File statico o API endpoint:[]]] Servire la chiave pubblica da un URL dedicato (ad esempio [] o []). Assicurare che il punto finale sia servito su HTTPS e autenticato per prevenire la sostituzione mitm. È possibile includere un checksum o hash della chiave pubblica nel codice client come fase di verifica.
  • Imposta nel codice lato client al momento della costruzione:[ Per le pagine generate dal server o le app mobili compilate, incorporare la chiave pubblica direttamente.
  • Infrastruttura chiave pubblica (PKI): Per le distribuzioni su larga scala, prendere in considerazione i certificati di emissione o utilizzare un server chiave che fornisce le chiavi pubbliche firmate.

Qualunque metodo si scelga, ] serve sempre la chiave pubblica su HTTPS[] per evitare manomissioni. Inoltre, considerare di pinning la chiave o utilizzando i registri di trasparenza del certificato per proteggere ulteriormente il canale di distribuzione.

3. Crittografare i dati sul lato client

Nel browser, l'API Web Crypto è l'unica interfaccia crittografica standard. Il flusso di lavoro tipico per la crittografia ibrida: generare una chiave AES casuale (ad esempio, 256-bit), crittografare il payload con AES-GCM, quindi crittografare il tasto AES con la chiave pubblica del server RSA-OAEP.

  • Importa la chiave pubblica del server (formato PEM) usando .
  • Genera una chiave AES casuale con spec .
  • Crittografare il testo in chiaro con la chiave AES usando ] con l'algoritmo AES-GCM.
  • Crittografare la chiave AES (come byte grezzi) con la chiave pubblica RSA-OAEP usando con .
  • Combinare la chiave crittografata, il payload crittografato e il vettore di inizializzazione AES-GCM (IV) in una singola struttura codificata a 64 basi.

Per i client mobili o desktop, SDKs nativi (ad esempio, framework di sicurezza iOS, Android Keystore) offrono primitivi simili. Utilizzare sempre [ la crittografia autenticata[ (come AES-GCM) per lo strato simmetrico per evitare manomissioni.

4. Decrittografare i dati sul lato server

Quando il server riceve il payload crittografato, utilizza la sua chiave privata per decifrare la chiave simmetrica, quindi utilizza quella chiave per decifrare i dati effettivi. In Node.js, utilizzando il modulo incorporato :

const privateKey = fs.readFileSync('private key.pem', 'utf8');
const crittografatoKey = Buffer.from(req.body.encrypted key, 'base64');
const crittografatoData = Buffer.from(req.body.encrypted data, '64basev

Decrittografare la chiave simmetrica con:

const decryptedKey = crypto.privateDecrypt({
chiave: privateKey,
imbottitura: crypto.constants.RSA PKCS1 OAEP PADDING,[
] oaepHash: 'sha256'
,

Quindi utilizzare quella chiave per decifrare i dati con AES-GCM:

(Credito)[FLT:]]decipher.setAuthTag (AuthTag);[FLT]

Sempre validare il tag di autenticazione per garantire l'integrità del testo cifrato. In produzione, gestire gli errori con grazia senza divulgare informazioni sulla chiave privata o sul processo di decrittografia.

5. Maniglia chiave di stoccaggio e controllo di accesso

La chiave privata è il gioiello della corona del sistema di crittografia. Conservalo con le misure di sicurezza più elevate disponibili:

  • Hardware Security Modules (HSM):[ Per la sicurezza a livello aziendale, utilizzare un HSM o cloud HSM (ad esempio, AWS CloudHSM, Azure Key Vault) che esegue operazioni di decrittazione all'interno di hardware antimanomissione. La chiave privata non lascia mai il dispositivo e l'accesso è controllato tramite le politiche IAM.
  • Servizi di gestione di tasti:[] Servizi come AWS KMS o Google Cloud KMS gestiscono in modo sicuro le chiavi e forniscono API di decrittografia senza esporre il materiale chiave al server di applicazione.
  • Variabili di ambiente con autorizzazioni limitate:[] Se un HSM non è fattibile, memorizzare la chiave privata in una variabile di ambiente o un gestore di segreti, garantire i permessi di file sono 600, e mai codificare il codice sorgente.
  • Creazione disco:[ Al minimo, crittografare il filesystem dove la chiave risiede e utilizzare politiche di rete restrittive per limitare l'accesso alla chiave.

Inoltre, registra tutte le operazioni di decrittografia per l'auditing, ma non registra mai i dati del testo normale o la chiave privata stessa.

Migliori Pratiche per un Robusto Asimmetric Encryption Attuazione

Gestione chiave e rotazione

La rotazione chiave è essenziale per limitare l'impatto di un compromesso chiave.Adottare una politica di rotazione che si allinea con la tolleranza di rischio: rotate il più spesso possibile mentre mantenere la stabilità operativa.Un modello comune è quello di mantenere le chiavi crittografate attivi: una chiave "corrente" e una chiave "next" chiave di controllo.

Guida della lunghezza del tatto: Utilizzare almeno 2048-bit RSA] (preferire 4096 per i segreti a lungo termine) o 256-bit ECC]] (ad esempio, primi256v1 o secp384r1) questi corpi sono considerati.

Scegli il giusto schema di crittografia

AES-GCM è lo standard del settore perché fornisce sia la riservatezza e l'integrità in un'unica operazione. Quando si crittografa la chiave simmetrica con RSA, utilizzare RSA-OAEP con SHA-256 (o più alto).

Proteggere contro le cadute comuni

  • Non riusare mai IV o nonce:[[ AES-GCM richiede una IV unica per crittografia con la stessa chiave.
  • Input di sanitize:[] Trattare tutti gli input crittografati come non attendibili. Convalida che il testo cifrato è ben formato e di lunghezza prevista prima di tentare la decrittazione.
  • Avoid time later channel:[] Utilizzare il confronto a tempo costante per i tag di autenticazione. Le librerie di alto livello solitamente gestiscono questo, ma il codice personalizzato può essere vulnerabile.
  • Separare le preoccupazioni:[] Non usare la stessa coppia chiave per la crittografia e le firme digitali a meno che il protocollo non lo richieda esplicitamente (e anche allora, utilizzare le chiavi separate, se possibile).

Ottimizzazione delle prestazioni

Per applicazioni ad alto rendimento, prendere in considerazione la decrittazione di scarico ad un servizio dedicato o usare l'accelerazione hardware. Nel browser, generare chiavi AES e eseguire operazioni di chiave pubblica è abbastanza veloce per le presentazioni di forma occasionali, ma per i file di grandi dimensioni o le comunicazioni in tempo reale, considerare l'utilizzo di TLS con i certificati client. Un'altra ottimizzazione: pre-generare più chiavi di sessione simmetriche e inviarle solo in modo asincrono.

Esempio di integrazione mondiale

Immaginate un'applicazione web sanitaria in cui i pazienti presentano record medici. L'applicazione utilizza la crittografia asimmetrica per proteggere i dati sensibili allo strato di applicazione, anche oltre TLS. Quando un paziente carica un PDF, il browser genera una chiave AES-256-GCM casuale, crittografa il PDF, quindi crittografa il tasto AES chiave con la chiave pubblica dell'ospedale RSA.

Questo modello si ridimensiona a qualsiasi scenario in cui la riservatezza dei dati contro il compromesso del server è fondamentale, e consente anche la crittografia controllata dal paziente: il paziente potrebbe tenere la chiave privata e condividere la chiave pubblica con l'ospedale, dando al paziente l'esclusiva capacità di decrittazione.

Risorse esterne e lettura

Per approfondire la vostra comprensione e rimanere attuali con le migliori pratiche, consultare queste fonti autorevoli:

Conclusioni

Integrando la crittografia asimmetrica nella tua applicazione web è un potente aggiornamento per la tua architettura di sicurezza. Protegge i dati sensibili anche quando il canale di trasmissione è compromesso, consente la comunicazione sicura senza segreti pre-condiviso, e fornisce una base per funzioni come la crittografia end-to-end e le firme digitali.