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.