2009-05-06 13 views
6

Estoy creando una secuencia de comandos que toma una lista de nombres y direcciones de correo electrónico y envía un correo electrónico invitándolos a registrarse en el sitio seguro de nuestro departamento. La lista de nombres y correos electrónicos está disponible en una página pública en el mismo sitio. Necesito una forma de darles un token único que los identificará cuando sigan un enlace en el correo electrónico a la página para registrar la cuenta. El usuario solo usará el token una vez para crear la cuenta y establecer su contraseña inicial.Estrategias para autenticar usuarios una sola vez sin identificador precompartido

¿Cuál sería el mejor método para generar el token? ¿Una cadena aleatoria almacenada en una base de datos? ¿Un hash generado a partir de la información del usuario y algo de sal? ¿Algo más? Entiendo que la seguridad de este método depende de la privacidad de la invitación individual al correo electrónico, que es muy poco comprensible.

+1

Su problema actualizado realmente no es diferente, conceptualmente. Todo lo que tiene que hacer es usar la dirección de correo electrónico en lugar del "nombre de usuario" al que hice referencia en mi respuesta. Así que genere aleatoriamente un token, almacénelo en algún lugar vinculado a la dirección de correo electrónico, y haga que el enlace en el correo electrónico contenga tanto su correo electrónico como el token para que pueda hacer la búsqueda. –

Respuesta

3

¿Por qué tiene que ser un hash en particular? Simplemente coloque el nombre de usuario del nuevo usuario como parte del enlace y genere al azar un token de autenticación de la longitud que desee, y almacénelo en la base de datos, vinculada a su nombre de usuario, hasta que se autentiquen.

Así el enlace que reciben en el correo electrónico es algo así como:

http://domain.com/confirm.php?user=Chad&t=AB14CD05 

Realmente no importa si hay colisiones, se trata de un evento de riesgo bastante bajo de todos modos. ¿Qué podría salir mal de todos modos, alguien más podría ... confirmar su dirección de correo electrónico para ellos? ¿Qué te preocupa? Quizás si explicas todo el proceso con un poco más de detalle, comprendería mejor tus requisitos.

+0

Creo que necesito cambiar la pregunta. Tienes razón, no debería encontrar la mejor manera de crear un hash para satisfacer mis necesidades, pero debería preguntar cuál sería la solución para el problema general de la autenticación cuando el único identificador semiprivado es el token que envío en la invitación. correo electrónico. ¿Debo modificar mi pregunta o debo publicar una nueva? –

9

Hay muchos algoritmos de hash diferentes. Puede consultar este enlace para ver si le funciona mejor, ya que no necesita un hash seguro. También puede mirar hacia arriba para ver cómo SSL lib generará un hash md4 de 8 caracteres.

http://www.partow.net/programming/hashfunctions/#top

1

Salida gperf.

GNU gperf es una función hash perfecta generador. Para una lista dada de cadenas , produce una función hash y una tabla hash, en forma de código C o C++ , para buscar un valor que dependa de en la cadena de entrada. La función hash es perfecta, lo que significa que la tabla hash no tiene colisiones, y la búsqueda de tablas hash necesita una sola cadena comparación solamente.

Y también CMPH - C Minimal Perfect Hashing Library

Hay varias preguntas relacionadas con SO:

+0

Gracias por las respuestas, parece que estaba haciendo la pregunta incorrecta. –

+0

Cualquiera que haya votado negativamente, gracias por el voto a favor de 'venganza' –

2

¿Por qué no asignar un número de 64 bits al azar enviar con el ID del usuario. Tome el número de 64 bits, divídalo en fragmentos de 5 bits y utilice cada fragmento de 5 bits para indexar en un alfabeto de 32 caracteres: 23456789ABCDEFGHJKLMNPQRSTUVWXYZ (omitiendo convenientemente 01IO). Con un número de 64 bits y 5 bits/código (excepto el último) obtendrá una babosa de 13 caracteres para identificar al usuario. Podrías rellenarlo con 2 personajes aleatorios para obtener 3 grupos de 5 personajes si así lo deseas.

Haga que la id y la parte slug de la url de inicio de sesión. Compruebe el valor de la barra almacenada con la identificación en la base de datos para asegurarse de que son iguales. Creo que para la mayoría de los propósitos, este sería un valor lo suficientemente grande como para que sea extremadamente difícil de adivinar, el número es aleatorio después de todo, qué babosa va con qué ID de usuario.Usando un generador de números aleatorios criptográficamente fuerte, creo que sería muy poco probable que incluso obtengas números repetidos para cualquiera de tus usuarios.

Podría verse como:

http://example.com/activate?userid=bgates&validate=GY45M-RHQBN-32GYM 

El uso de un hash de los valores conocidos en realidad podría hacer que sea más fácil para alguien que adivinar el código correcto que el uso de un número aleatorio. Usando un hash uno solo tiene que adivinar qué bits está usando y ejecutarlos a través de varios algoritmos hash. Si alguien puede unir estos elementos, por ejemplo, dados algunos ejemplos y tiempo suficiente para probar varias combinaciones, entonces todo lo que tiene que hacer para descifrar el código de alguien es determinar los atributos (probablemente) comúnmente conocidos para una persona determinada y usarlos para suplantar. ellos y crea una cuenta. Con un número aleatorio fuerte asignado a cada individuo, solo les queda un ataque de fuerza bruta.

+0

Muy buen punto acerca de que los hash son posibles para "ingeniería inversa". Y si realmente le preocupa que las personas adivinen los números aleatorios, agregue alguna protección que borre su cuenta si intentan autenticarse con el token equivocado 10 veces o algo así. Entonces es casi imposible hacerse pasar por alguien. –

+0

Si realmente necesita usar un hash basado en "valores conocidos", puede saltear el hash, lo que hace que sea extremadamente difícil de adivinar. P.ej. sha1 ("6b34ff3b93d0ebd46d3e". $ nombre de usuario. "8ca97cf1ae342d340f26"). Por supuesto, si se filtra la sal, entonces se te aplica una manguera. Pero sí, es mejor generar un valor aleatorio no relacionado con la información del usuario y almacenar ese valor aleatorio en una base de datos. – dirtside

Cuestiones relacionadas