¿Necesita consejos sobre la clave API y la generación secreta?

2

Mientras trabajo en un proyecto Java usando Spring-boot, Spring-security y JWT token, necesito proporcionar acceso a través de la clave API y el secreto. Después de buscar en Google durante un tiempo sobre la generación de claves / secretos, esto es lo que encontré:

  • Para la generación de claves, parece que una UUID con protección criptográfica sin - sería una buena opción.
  • Para la generación secreta, todavía no encontré una sugerencia clara. Pero parece que algunos otros sitios están usando el algoritmo HMAC-SHA512 para el secreto y lo almacenan como una representación de cadena base64 (rellenada con 88 caracteres) de la clave.

Aquí hay algunos enlaces que describen la clave de API & secreto:

Un ejemplo de un sitio de bitcoin, que proporciona clave de API / acceso secreto:

Las preguntas son:

  • ¿Qué algoritmo es adecuado para el secreto?
  • ¿Son los algoritmos sha256 o sha512 una buena elección? En caso afirmativo, sería útil tener alguna sugerencia sobre su generación.
pregunta Eric Wang 23.02.2018 - 10:55
fuente

1 respuesta

1

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.

    
respondido por el Neil Smithline 23.02.2018 - 16:44
fuente

Lea otras preguntas en las etiquetas