È sicuro autorizzare richieste API utilizzando un RSA? [chiuso]

0

Vorrei offrire ai nostri utenti l'accesso ai dati privati utilizzando un'API.

  • Non voglio memorizzare le credenziali API nel mio database. (Lo stesso motivo per cui non memorizzo la password nel database.

  • Non ho alcun problema che altri possano leggere i dati inviati al nostro server.

  • Non voglio che le credenziali vengano inviate al nostro server perché altre saranno in grado di clonare le credenziali.

  • Non mi fido di SSL. (Alcuni utenti potrebbero disporre di certificati di root non attendibili)

Ciò che altri hanno fatto, stava usando api_key e segreto. Hanno usato il segreto per firmare il messaggio. (Vedi Bitfinex per esempio link )

Ho pensato che fosse più sicuro usare RSA. Ogni utente riceverà una chiave privata (non la memorizzeremo). Lo useranno per crittografare il messaggio (usando nonce), useremo una chiave pubblica per decrittografarlo.

So che c'è un problema di prestazioni con RSA, ma è per messaggi molto brevi, quindi non mi riguarda.

Perché altri non lo fanno? C'è qualche problema di sicurezza con esso?

    
posta Aminadav Glickshtein 10.01.2018 - 11:37
fonte

2 risposte

1

In questo modo è possibile creare un sistema sicuro usando RSA, ma stai cercando un mondo di dolore ed è probabile che finirai per creare un sistema non sicuro.

RSA è una primitiva crittografica di livello molto basso, è un livello troppo basso per uno sviluppatore di applicazioni con cui lavorare e usarlo espone a molte vulnerabilità se non usato correttamente. Lascia la scrittura del codice crittografico agli esperti e usa la crittografia di livello superiore, TLS o OpenPGP dovrebbero essere il livello che stai guardando, non RSA.

I know that there are a performance issue with RSA, but it is for very short messages, so it is not concerning me.

Il problema con RSA non è solo prestazioni. RSA non può essere utilizzato per crittografare i dati più grandi della dimensione della chiave meno paddings, il che significa che una chiave RSA a 2048 bit ha un dimensione massima di input di 256 byte (o 245 byte se si utilizza il pad v1.5). Ciò significa che se si desidera crittografare i dati più grandi di questa dimensione, è necessario implementare una modalità di concatenamento e concatenare la modalità è una delle cose più facili da sbagliare quando si implementa la crittografia. Inoltre nessuno ha mai implementato o fa alcuna analisi cronica sulla modalità di concatenazione RSA (la maggior parte delle modalità di concatenamento sono analizzate per cifrari simmetrici), quindi sei lì da solo.

Un altro problema è che tutti i primitivi crittografici alla fine devono essere sostituiti quando i computer diventano più forti e le vulnerabilità vengono trovate in questi primitivi. Pertanto, tutte le applicazioni di crittografia pratiche devono aggiungere metadati che consentano la negoziazione e la sostituzione delle primitive di crittografia e dei relativi parametri. TLS, S / MIME, OpenPGP e il formato hash della password crypt hanno tutti questa funzionalità integrata nel protocollo. Questo è anche un altro aspetto che è facile sbagliare.

Un altro problema che la semplice RSA non fa è la prevenzione della riproduzione. Per questo, è necessario aggiungere un sale o IV e possibilmente una sfida. E ordina la firma e la crittografia dei livelli viene anche con le proprie insidie.

Potrei andare tutti i giorni a spiegare le varie insidie se stai cercando di utilizzare un semplice RSA per implementare qualsiasi sistema di crittografia.

I protocolli di alto livello come OpenPGP e TLS utilizzano RSA come primitiva sottostante, ma quando si utilizzano protocolli crittografici di alto livello, questi problemi sono stati pensati per voi da crittografi esperti e le loro implementazioni sono state anch'esse attentamente esaminate. Tutti i problemi rimanenti sono risolti o è abbastanza facile configurare il sistema quando c'è un compromesso.

In particolare, OpenPGP ha una modalità di firma, che fa effettivamente ciò che lei ha menzionato, usando la chiave privata per firmare un dato per dimostrare la paternità, anche se in modi più sofisticati. Una firma OpenPGP viene creata crittografando un hash del messaggio piuttosto che il messaggio stesso, evitando così la necessità di eseguire il concatenamento e aggiunge un numero di metadati per la protezione da vari attacchi. TLS ha proprietà simili durante l'handshake se si utilizza l'autenticazione reciproca ma sono impliciti nella connessione, quindi potrebbe non essere adatto se si desidera archiviare e / o inoltrare la prova di paternità a un'altra entità.

TL; DR Non pubblicare la tua crittografia . Se è necessario mantenere la prova di paternità, utilizzare la firma di OpenPGP; altrimenti basta avvolgere la comunicazione in TLS usando l'autenticazione reciproca.

Why others not doing it? There is any security issue with it?

Perché è stupidamente complicato farlo correttamente, quando puoi semplicemente utilizzare l'autenticazione reciproca TLS con solo poche righe di codice. A meno che il tuo schema non venga esaminato in modo massivo come TLS e OpenPGP, posso assicurarti che il tuo schema avrà punti deboli che non avresti praticamente nessuna possibilità di scoprire.

    
risposta data 10.01.2018 - 13:22
fonte
0

We will use a public key to decrypt it.

Ciò che proponi è di cambiare il significato di privato e pubblico all'interno di una coppia di chiavi RSA. La chiave pubblica è considerata pubblica in quanto la sua conoscenza da parte di un utente malintenzionato non è un problema di sicurezza. Ma, dal momento che si propone di crittografare con la chiave privata e decifrare con la chiave pubblica, quest'ultima è in realtà quella che deve essere protetta, vale a dire che la propria chiave pubblica deve essere mantenuta privata mentre la chiave privata associata potrebbe effettivamente essere pubblicata. / p>

In altre parole: un utente malintenzionato che ottiene l'accesso al server può decrittografare tutti i messaggi che vengono inviati al server utilizzando solo le informazioni trovate sul server (ad esempio le tue chiavi "pubbliche"). E questo è esattamente quello che hai cercato di prevenire, in primo luogo.

    
risposta data 10.01.2018 - 12:06
fonte

Leggi altre domande sui tag