2008-08-29 15 views
13

Hace unos meses me encomendaron la implementación de un código único y aleatorio para nuestra aplicación web. El código debería ser fácil de usar y lo más pequeño posible, pero seguir siendo esencialmente aleatorio (por lo que los usuarios no podrían predecir fácilmente el próximo código de la secuencia).¿Cómo puedo generar una clave única, pequeña, aleatoria y fácil de usar?

Se terminó la generación de valores que parecían algo como esto:

Af3nT5Xf2 

Desafortunadamente, nunca fue satisfecho con la aplicación. Los de Guid estaban fuera de discusión, simplemente eran demasiado grandes y difíciles para que los usuarios ingresaran. Esperaba algo más parecido a 4 o 5 caracteres/dígitos, pero nuestra implementación particular generaría secuencias notablemente modeladas si codificáramos para menos de 9 caracteres

Esto es lo que terminamos haciendo:

Sacamos un identificador de 32 bits único secuencial de la base de datos. Luego lo insertamos en los bits centrales de un entero RANDOM de 64 bits. Creamos una tabla de búsqueda de caracteres fácilmente tipados y reconocidos (A-Z, a-z, 2-9 omitiendo caracteres fácilmente confusos como L, l, 1, O, 0, etc.). Finalmente, usamos esa tabla de búsqueda para codificar en base 54 el entero de 64 bits. Los bits altos eran aleatorios, los bits bajos eran aleatorios, pero los bits centrales eran secuenciales.

El resultado final fue un código que era mucho más pequeño que un guid y parecía aleatorio, aunque no lo era en absoluto.

Nunca estuve satisfecho con esta implementación en particular. ¿Qué habrías hecho?

+1

¿Por qué necesita el valor secuencial? ¿Tienes que volver a eso? En caso afirmativo, use una función criptográfica para encriptar su número secuntario con una clave secreta y codifique el cifrado con el alfabeto de su elección. – Oli

Respuesta

3

En C#, he usado el método 'System.IO.Path.GetRandomFileName() : String' ... pero estaba generando sal para los nombres de los archivos de depuración. Este método devuelve cosas que se parecen a su primer ejemplo, excepto con una extensión de archivo '.xyz' al azar también.

Si está en .NET y solo quiere una solución más simple (pero no "más bonita"), diría que esto es ... podría eliminar la extensión de archivo aleatorio si lo desea.

3

En .NET puede utilizar los GetBytes método RNGCryptoServiceProvider() que "llenar una matriz de bytes con un criptográficamente fuerte secuencia de valores aleatorios" (de documentación ms).

byte[] randomBytes = new byte[4]; 
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
rng.GetBytes(randomBytes); 

Puede aumentar el lengh de la matriz de bytes y extirpar a los valores de carácter que desea permitir.

7

Así es como lo haría.

Obtengo una lista de palabras comunes en inglés con frecuencia de uso y cierta información gramatical (como ¿es un sustantivo o un verbo?). Creo que puedes mirar alrededor de los intertubes para ver alguna copia. Firefox es de código abierto y tiene un corrector ortográfico ... por lo que debe ser obtenible de alguna manera.

Luego correría un filtro, de modo que se eliminan las palabras oscuras y se excluyen las palabras que son demasiado largas.

Entonces mi algoritmo de generación elegiría 2 palabras de la lista y las concatenaría y agregaría un número aleatorio de 3 dígitos.

También puede aleatorizar patrón de selección de palabras entre el verbo/sustantivos como

eatCake778
pickBasket524
rideFlyer113 etc ..

el caso no tiene por qué ser carcasa camello, puedes aleatorizar eso también. También puede aleatorizar la ubicación del número y el verbo/sustantivo.

Y como eso es una gran cantidad de aleatoriedad, Jeff's The Danger of Naïveté es una lectura obligada. También asegúrese de estudiar ataques de diccionario con bastante antelación.

Y después de haberlo implementado, ejecutaba una prueba para asegurarme de que mis algoritmos nunca colisionen. Si la tasa de colisión fuera alta, jugaría con los parámetros (cantidad de sustantivos utilizados, cantidad de verbos usados, longitud del número aleatorio, cantidad total de palabras, diferentes tipos de tripas, etc.)

+0

Las palabras comunes en inglés no serían buenas para un sitio similar a tinyurl. Está describiendo más un generador de contraseñas IMO. – dfrankow

+0

@dfrankow De la pregunta "código único y aleatorio para nuestra aplicación web. El código debería ser fácil de usar y lo más pequeño posible, pero seguir siendo esencialmente aleatorio" ... ¿Qué extraño? – chakrit

0

Si por usuario amigable, quiere decir que un usuario podría escribir la respuesta, entonces creo que le gustaría mirar en otra dirección. He visto y hecho implementaciones para contraseñas aleatorias iniciales que eligen palabras y números aleatorios como una cadena más fácil y menos propensa a errores.

Si, aunque estás buscando una forma de codificar un código aleatorio en la cadena URL, que es un problema que he tratado por un tiempo, entonces lo que he hecho es utilizar GUID codificados de 64 bits.

0

Puede cargar su lista de palabras como chakrit sugerido en una tabla de datos o archivo xml con una clave secuencial única. Al obtener su palabra al azar, use un generador de números aleatorios para determinar qué palabras buscar por su clave. Si concatenas 2 de ellos, no creo que necesites incluir los números en la cadena a menos que la "verdadera aleatoriedad" sea parte del objetivo.

Cuestiones relacionadas