2009-12-18 11 views
10

Estoy escribiendo un pequeño sistema que me permitirá vender la música de mi banda en conciertos generando cupones que se pueden canjear por MP3 en nuestro sitio web.GUÍA de lectura humana

Los cupones tendrán un código que el usuario escribe en el código debe tener las siguientes cualidades:.

  1. cierto nivel de legibilidad humana en términos de duración y contenido, para evitar la frustración del usuario y la entrada de datos error.
  2. Dado un código de cupón, no es trivial para adivinar otro código de cupón.

Si uso GUIDs estoy preocupado por el punto 1. Si uso un número entero creciente, me preocupa el punto 2. Tiene que haber algún medio feliz, ¿no? Pensé que tal vez este trabajo ya se haya realizado y que haya una solución ideal esperándome. En ausencia de eso, creo que iré con una cadena alfanumérica aleatoria, o posiblemente solo letras (excluyendo I y O para mayor claridad), y la aplicación bloqueará las direcciones IP que fallan X veces, lo que indicaría un posible ataque de fuerza bruta. Si fui con eso, ¿cuánto tiempo de una cadena y qué valor de X funcionaría, y por qué?

Gracias por su ayuda!


Actualización: Yo no estaba totalmente explícita sobre el método: Voy a generar listas de códigos de bono para la impresión, a continuación, introduzca los códigos de "vendidos" después de un concierto. Por lo tanto, creo que elementos como una suma de comprobación no son necesarios, como lo son en las claves de software que no usan servidores de validación.

+0

Gracias por todas las sugerencias útiles y/o exóticas chicos! Koper ganó en practicidad y simplicidad, con Mark Ransom en segundo lugar. –

+0

Sobre el bloqueo de ataques de fuerza bruta no me molestaría en comenzar. Con respecto a ti y tu banda, no es como si estuvieras protegiendo algo realmente importante. Simplemente me parece un poco desproporcionado. –

+0

Tienes toda la razón, me estoy divirtiendo demasiado diseñando el sistema. Pero ahí lo tienes, soy un programador de corazón. Además, si todo funciona, podría albergar álbumes de otras bandas. –

Respuesta

4

Solo 8 letras alfanuméricas (excepto I y O) tienen 1785793904896 combinaciones posibles. Eso es para todos los propósitos y propósitos inimaginables siempre que no tenga 5 billones de cupones.

2

5 bloques de 5 caracteres cada uno deberían ser suficientes: cuatro bloques para la "clave", el quinto como suma de comprobación para garantizar la validez. Y, por supuesto, no use todo el espacio de teclas.

Así es como los números de serie del software parecen estar dispuestos, de todos modos.

+0

¡Interesante, nunca lo supe! Para mi sistema, sin embargo, ese tipo de algoritmo no es directamente aplicable, ya que estaré pregenerando estos números y luego "validando" los códigos que vendí después de un concierto. –

+0

Sigue siendo aplicable; después de todo, no necesita dar todos los códigos. –

9

Puede utilizar una Cadena de Markov formada en sílabas en inglés para crear una oración compuesta de palabras pronunciables y galimatías. Simplemente agregue la oración generada a una base de datos de comprobantes válidos cuando los imprima (y los invalide cuando se canjeen, por supuesto).

+8

Me recuerda a http://thedailywtf.com/Articles/The-Automated-Curse-Generator.aspx –

+0

También puede usar algún tipo de análisis N-gram: puede ser más fácil de comprender e implementar. http://en.wikipedia.org/wiki/N-gram –

+0

Mi último comentario es un poco confuso: el análisis de N-gramas se puede usar para hacer la parte de "entrenamiento". –

2

hmm, no sé cómo funcionan la mayoría de los sistemas, pero creo que sería claro y sencillo definir un número estático y multiplicar ese número por otro número aleatorio. Entonces, si el gran GUID es un múltiplo de tu estática, eres bueno.

fácil de producir, no es fácil de adivinar por uno nuevo (sólo uso a corto plazo)

int i = 61234; 
int j = rand()%99999 
long GUID = i * j; 

le dará un número de teléfono longitud GUID

solamente 99999 utiliza sin embargo! doh

+1

hmm, si no puedo alcanzar las 100,000 ventas ¡nuestro álbum no puede ser platino! –

4

AOL solía usar una combinación aleatoria de dos palabras para los CD que enviaban. Puede seguir el mismo enfoque y aumentar el número de palabras para obtener las probabilidades que necesita.

+0

¡Me gusta esto! Tres palabras de [esta lista] (http://www.math.toronto.edu/jjchew/scrabble/lists/common-234.html) de 3 y 4 palabras con letras tendrían un espacio de teclas de 128,405,466,125 ... muy aceptable. –

1

Una solución simple es llamar al método getHashCode que la mayoría de los idiomas tienen en sus tipos de cadenas. Establezca la cadena a alguna palabra de su lista de palabras aprobadas. Luego llame a gethashcode y esa será su clave. Para verificarlo, compárelo con su lista de hash de palabras existentes y elimínelo de la lista para que no pueda volver a utilizarse.

5

Utilizaría su propio esquema de codificación. Además de omitir I y O, para una legibilidad óptima, también es una buena idea omitir todas las letras excepto una de conjuntos casi homónimos (C/E, M/N) y letras de varias sílabas, como W, y por supuesto, seguir con Un caso.

En cuanto a la longitud, puede usar 60 bits, más una suma de comprobación de 4 bits. 64 bits es suficiente para almacenar el tiempo en granularidad de milisegundos durante varios miles de años, por lo que es inútil para todos los propósitos prácticos. A decir 4 bits por letra, eso es 16 letras de largo. Incluso la mitad de esa longitud es probablemente suficiente.

Otra forma de pensar en esto es en forma de matrículas de automóviles: 3 letras y 3 números son suficientes para cubrir un estado bastante grande, y tienden a ser muy legibles. A menos que proporcione una forma para que alguien piratee códigos a alta velocidad, ciertamente no serán adivinados a escalas de tiempo humanas.

+1

conjuntos de homónimos! Esto es para lo que vengo así. :) –

+0

@RickNZ: Windows NTFS y OpenVMS utilizan marcas de tiempo de 64 bits: ambos cuentan con diez millones de tics por segundo. El rango de años es de 1601 a 60.055 para NTFS y de 1858 a 31.084 para VMS. (VMS reserva la mitad "negativa" del rango para propósitos de tiempo relativo.) – wallyk

+0

Ver mi actualización ... – RickNZ

2

Probablemente sea mejor evitar todas las vocales [*], evitando así todas las palabrotas.

[*] ¡Incluyendo W si eres galés!

+1

W es también la única letra polisilábica, por lo que toma mucho más tiempo decirlo (de ahí mi intensa aversión a "www "para sitios web!). – RickNZ

+2

¿No dices "dub dub dub"? – wallyk

+0

recuerda "trip dub"? o peor aún, en la década de 1990 en la radio escucharía "aitch tee tee pee, colon, slash, slash, ..." –

1

Supongo que recibirá una dirección de correo electrónico cuando compren el comprobante (debe hacerlo). Si es así, ¿por qué no simplemente enviarles un GUID de un solo uso? De esta forma, tanto usted como ellos tienen un registro de ello, puede realizar un seguimiento de los reembolsos, no corre el riesgo de adivinar (o al menos no vale la pena preocuparse), el usuario no tiene que recordar nada porque está allí en el correo electrónico, y no tienes que codificar nada.

Te dan tu dirección de correo electrónico. Usted envía un GUID por correo electrónico (con un enlace). Hacen clic en el enlace y obtienen una canción. El uso de GUID está registrado en el sistema y ya no funcionará.

+2

Por mucho que me gustaría obtener una lista de direcciones de correo electrónico de fans, creo que actuaría como un elemento de disuasión. Estamos hablando de una compra impulsiva de $ 5 a la 1:00 a.m., y anotar su dirección de correo electrónico podría reducir ese impulso. –

+0

¡Buen punto! Si me gusta la banda, eso no me detendrá, pero puedo ser la excepción en lugar de la regla. – Chuck

1

¿Por qué no acaba de ir con el GUID y luego reemplazar los caracteres cuestionables con una letra diferente (por lo que 0 se convierte en 'h', 1 es 'q' y así sucesivamente).

3

Bueno, si realmente quiere legible para humanos, puede usar BubbleBabble. Crear un script de Perl como la siguiente:

#!/usr/bin/perl 
use Digest::BubbleBabble qw(bubblebabble); 
use Digest::SHA1 qw(sha1); 
print bubblebabble(Digest => sha1(join(' ', @ARGV))), "\n"; 

luego alimentar cualquier argumento de línea de comando que desea obtener una salida como la siguiente:

xogan-nydut-zogiv-kotyn-ledah-taseb-gyhib-tucel-vudul-mykom-mexax 

O si Perl no es su preferencia, puede utilizar APG ' s modo de contraseña pronunciable (also available online) para obtener una salida como ésta:

BedHiv 
cotsEub 
AvRabinn 
rarcUs 
TeuvVarn 
yuwats 

Honestamente, este nivel de legibilidad humana es una exageración; La respuesta de RickNZ debería funcionar bien (y es bastante similar a lo que hicimos con algunas claves de software). Pero BubbleBabble es divertido.

+0

Definitivamente divertido, gracias por tomarse el tiempo. –