Clave de acceso en la URL - ¡Asegurando lo no seguro!

0

Tengo algunas dificultades para hacer esto de la manera correcta (por mucho que pueda) .
Hace algún tiempo, le pedí a pregunta aquí , pidiendo ayuda sobre cómo implementar el envío de un enlace de acceso a través de correo electrónico.

Primero, sé que esto es terriblemente inseguro desde el principio, pero tenemos nuestras razones, así que dejemos eso de lado.

La Idea

La idea básicamente es enviar un correo electrónico con un enlace de larga duración que le permita acceder a un área muy específica de nuestra aplicación.
Enlace de ejemplo: ourwebsite.com/users/ACCESS-KEY

El ataque que quiero evitar

Un usuario adivina otra clave de acceso usando la suya.

Lo que me sugirieron

En mi pregunta anterior, se me sugirió usar una cadena aleatoria como la clave de acceso que se guardará en mi base de datos.
He estado investigando un poco, y me preocupa que mi PRNG no sea lo suficientemente aleatorio, especialmente porque estoy generando un montón de claves de acceso a la vez.
He estado traumatizado por las lecciones de C # en la escuela, donde mi función "aleatoria" cambiaría la producción cada 1000 o más iteraciones.

Estoy pensando en usar Random.org para tener una semilla realmente aleatoria, pero eso parece un poco exagerado.

Mis pensamientos

Tengo 4 opciones que quiero consultar con ustedes antes de sucumbir a Random.org -

  1. Simplemente utilizando el PRNG, verificando de antemano cómo se comporta (el PRNG de Node.js), tal vez implementando un sleep(500) entre generaciones. Si el resultado es similar pero no idéntico, hash con SHA-2.
  2. Tomar el ID de usuario y hacer el hashing a fondo con PBKDF2 (¿importa?), guardarlo en la base de datos y simplemente enviarlo.
  3. Usando un PRNG implementado como Mersenee Twister, como se sugiere en esta pregunta de stackoverflow .
  4. Otras cosas de las que no sé nada, como un cifrado que solo sé cómo descifrar, o JWT como lo estoy usando para mis usuarios habituales.

¿Qué piensas?
Gracias por cualquier ayuda! Aprecio tomarme el tiempo para leer esto.

    
pregunta Neta 22.01.2016 - 13:42
fuente

3 respuestas

1

ok, solo necesita hacer hash de los datos específicos del usuario (pero nada crítico) y combinar los datos del usuario con números únicos difíciles de adivinar, como un par de entradas aleatorias y la fecha de creación (hasta el segundo, si es posible)

... hash esto por completo y tienes una cadena muy difícil de adivinar. la fecha no será la misma a menos que todos la creen en el mismo segundo. haciendo esto más complejo. Ah, y no olvides usar tu propia sal también.

el uso de un generador de números aleatorios para algo como esto no es una buena idea (a menos que se combine, pero no se desea un número aleatorio demasiado grande para el hashing), mientras que las probabilidades son muy muy muy bajas, es posible generar la misma clave para otro usuario, utilizando mis sugerencias, elimina esa posibilidad.

usar una sal de su propia creación le da una sensación de contraseña personal que nadie en el mundo exterior debería descubrir, si la descubren, tiene más cosas de las que preocuparse.

las entradas aleatorias le dan un poco de aleatoriedad para detener las conjeturas informadas.

los datos del usuario hacen que la cadena sea única y la fecha agrega una capa adicional para que alguien no pueda adivinar la cadena sin saber la fecha de creación. mantener su algoritmo y el orden en el que lo ensamblan es igual de importante.

tus puntos:

Solo usando el PRNG, verificando de antemano cómo se comporta (el PRNG de Node.js), tal vez implementando un sueño (500) entre generaciones. Si el resultado es similar pero no idéntico, hash con SHA-2. - Ya he mencionado esto, no es necesario, pero realmente es una elección.

Tomar el ID de usuario y hacer el hashing completamente con PBKDF2 (¿importa?) - sí y no, la función de hashing no importa (solo no md5) siempre que su hashing sea un hash y no un cifrado (si puede descifrar la cadena es un cifrado, NO HAGA ESTO ESTO ES PELIGROSO)

Otras cosas de las que no sé nada, como un cifrado que solo sé cómo descifrar, o JWT como los que estoy usando para mis usuarios habituales, no descifrar

    
respondido por el TheHidden 22.01.2016 - 13:57
fuente
2

Todo lo que necesitas en este caso es GUID para la clave. La mayoría de las implementaciones son aleatorias y siempre van a ser únicas.

Por supuesto, podría cifrarlo con AES, pero eso realmente no agrega ninguna seguridad adicional por encima del uso de GUID estándar.

    
respondido por el user1751825 22.01.2016 - 14:29
fuente
1

Use un generador de números pseudoaleatorios criptográficamente seguro (CSPRNG) .

No utilice clases como math.random o similar, ya que generalmente se acumulan con el número de segundos desde la medianoche y, a menudo, no se consideran lo suficientemente impredecibles si se siembran con otra cosa.

Ejemplos en diferentes idiomas son:

  • C # - RNGCryptoServiceProvider
  • JavaScript del lado del cliente - Window.crypto
  • NodeJS - secure-random
  • Linux - / dev / urandom
respondido por el SilverlightFox 25.01.2016 - 12:20
fuente

Lea otras preguntas en las etiquetas