Creo que estás confundiendo los requisitos de seguridad para las ID de clientes y los secretos.
- ID de cliente: debe ser único, mejor si no se puede adivinar. Si bien, por lo general, no se anuncian públicamente, no se tratan con tanto cuidado como los secretos.
- Secretos: Deben ser imputables y mantenerse en privado. Una posible filtración de un secreto es un incidente de seguridad, que requiere la revocación inmediata de la clave.
Lo que parecen las identificaciones de tus clientes es una cuestión de gustos. Los ejemplos en el sitio oauth.com a los que hace referencia incluyen claves de diferentes tamaños y formatos. Un número aleatorio es una buena elección. Algo así como (en pseudocódigo):
clientID = base64Encode(secureRandom(16)); // 16 bytes, 128 bits, 22 characters
En algunas situaciones, podría usar un número aleatorio no seguro, pero hay situaciones en las que eso puede llevar a la previsibilidad. Así que solo quédate con el generador seguro de números aleatorios, es solo un poco más lento y está garantizado para ser seguro.
La única forma de generar un secreto es con un seguro generador de números aleatorios:
secret = base64Encode(secureRandom(32)); // 32 bytes, 256 bits, 43 characters
Los secretos nunca deben almacenarse en texto sin cifrar. Cifralos y almacena la clave de cifrado en un lugar seguro.
Mencionó los GUID, pero incluso los versión aleatoria 4 varían según la implementación, algunos son seguros y otros no. Así que simplemente me mantendría alejado de ellos. También mencionaste los algoritmos hash SHA256 y SHA512. Es posible utilizarlos en el cálculo de un número aleatorio, pero es complejo hacerlo correctamente. Simplemente quédate con un generador de números aleatorios seguro y estarás a salvo.
Como ya está utilizando Spring, RandomValueStringGenerator es probablemente una buena opción para la implementación. Basta con crear generadores del número correcto de bytes. También puede consultar código fuente de esa clase para referencia.