Me doy cuenta de que la especificación de OAuth no especifica nada sobre el origen del código ConsumerKey, ConsumerSecret, AccessToken, RequestToken, TokenSecret o Verifier, pero tengo curiosidad por saber si existen mejores prácticas para crear tokens significativamente seguros (especialmente Token / Combinaciones secretas).
Como lo veo, hay algunos enfoques para crear los tokens:
- Simplemente use bytes aleatorios, almacénelos en la base de datos asociada con el consumidor / usuario
- Hash algunos datos específicos del usuario / consumidor, almacenar en la base de datos asociada con el consumidor / usuario
- Cifrar datos específicos del usuario / consumidor
Las ventajas de (1) son que la base de datos es la única fuente de información que parece la más segura. Sería más difícil ejecutar un ataque contra (2) o (3).
El hash de datos reales (2) permitiría volver a generar el token a partir de datos presumiblemente ya conocidos. Es posible que en realidad no proporcione ninguna ventaja a (1), ya que de todos modos necesitaría almacenar / buscar. Más CPU intensiva que (1).
Cifrar datos reales (3) permitiría descifrar información conocida. Esto requeriría menos almacenamiento y potencialmente menos búsquedas que (1) y (2), pero también potencialmente menos seguro.
¿Existen otros enfoques / ventajas / desventajas que deban considerarse?
EDITAR: otra consideración es que DEBE haber algún tipo de valor aleatorio en los Tokens, ya que debe existir la capacidad de caducar y volver a emitir nuevos tokens, por lo que no debe estar solo compuesto por datos reales.
Siga las preguntas :
¿Existe una longitud mínima del Token para que sea criptográficamente segura? Según tengo entendido, los Token Secrets más largos crearían firmas más seguras. ¿Es correcto este entendimiento?
¿Hay ventajas de usar una codificación particular sobre otra desde una perspectiva de hash? Por ejemplo, veo muchas API que utilizan codificaciones hexadecimales (por ejemplo, cadenas GUID). En el algoritmo de firma de OAuth, el token se usa como una cadena. Con una cadena hexadecimal, el conjunto de caracteres disponible sería mucho más pequeño (más predecible) que, digamos, con una codificación Base64. Me parece que para dos cadenas de igual longitud, la que tiene el conjunto de caracteres más grande tendría una distribución de hash mejor / más amplia. Esto me parece que mejoraría la seguridad. ¿Es esta suposición correcta?
La especificación OAuth plantea este mismo problema en 11.10 Entropy of Secrets .