Hai bisogno di consigli sulla chiave API e sulla generazione segreta?

3

Mentre lavoro su un progetto Java usando il token Spring-boot, Spring-security e JWT, ho bisogno di fornire l'accesso tramite chiave API e segreto. Dopo aver cercato su Google per un po 'di tempo sulla generazione di chiavi / segreti, ecco cosa ho trovato:

  • Per la generazione di chiavi, sembra un UUID protetto da crittografia senza - sarebbe una buona scelta.
  • Per la generazione segreta, non ho ancora trovato un chiaro suggerimento. Ma sembra che alcuni altri siti stiano utilizzando l'algoritmo HMAC-SHA512 per il segreto e lo memorizzino come una rappresentazione di stringa base64 (completata fino a 88 caratteri) della chiave.

Ecco alcuni link descrivono la chiave API & segreto:

Un esempio da un sito bitcoin, che fornisce la chiave API / accesso segreto:

Le domande sono:

  • Quale algoritmo è adatto per il segreto?
  • Gli algoritmi sha256 o sha512 sono una buona scelta? Se sì, sarebbe utile avere qualche suggerimento sulla sua generazione.
posta Eric Wang 23.02.2018 - 10:55
fonte

1 risposta

2

Penso che tu stia confondendo i requisiti di sicurezza per gli ID e i segreti dei clienti.

  • ID cliente: deve essere unico, meglio se non gestibile. Anche se in genere non sono pubblicizzati pubblicamente, non vengono trattati con la stessa cura dei segreti.
  • Segreti: dev'essere incurabile e tenuto privato. Una potenziale perdita di un segreto è un incidente di sicurezza, che richiede la revoca immediata della chiave.

Che aspetto hanno i tuoi ID cliente è una questione di gusti. Gli esempi nel oauth.com sito di riferimento includono chiavi di varie dimensioni e formati. Un numero casuale è una buona scelta. Qualcosa come (in pseudocodice):

clientID = base64Encode(secureRandom(16)); // 16 bytes, 128 bits, 22 characters

In alcune situazioni potresti usare un numero casuale non sicuro, ma ci sono situazioni in cui ciò può portare alla prevedibilità. Quindi basta attaccare con il generatore di numeri casuali sicuro - è solo un po 'più lento e garantito per essere sicuro.

L'unico modo per generare un segreto è con un generatore di numeri casuali sicuro :

secret = base64Encode(secureRandom(32)); // 32 bytes, 256 bits, 43 characters

I segreti non dovrebbero mai essere archiviati in testo chiaro. Crittografali e archivia la chiave di crittografia in un posto sicuro.

Hai menzionato i GUID, ma anche la versione casuale 4 varia a seconda dell'implementazione, alcuni sono sicuri e altri no. Quindi starei alla larga da loro. Hai anche menzionato gli algoritmi di hash SHA256 e SHA512. È possibile utilizzare quelli nel calcolo di un numero casuale, ma è complesso farlo correttamente. Basta attaccare con un generatore di numeri casuali sicuro e sarai al sicuro.

Poiché stai già utilizzando Spring, RandomValueStringGenerator è probabilmente una buona scelta per l'implementazione. Basta creare generatori del numero corretto di byte. Puoi anche consultare codice sorgente di quella classe come riferimento.

    
risposta data 23.02.2018 - 16:44
fonte

Leggi altre domande sui tag