2010-09-21 22 views
16

Por una variedad de razones estúpidas, la longitud máxima de una variable de formulario dada que estamos publicando en un servidor externo es de 12 caracteres.cifrado php más corto que md5?

Quería oscurecer ese valor con md5, pero obviamente con 12 caracteres que no va a funcionar. ¿Hay un cifrado con una función PHP ya hecha que dará como resultado algo de 12 caracteres o menos?

La seguridad e integridad del cifrado no es muy importante aquí. Mi último recurso es simplemente escribir una función que mueva cada letra hacia arriba o hacia abajo un valor de ascii en x. Entonces, el objetivo no es ocultarlo de un experto en criptografía, sino simplemente no publicarlo en texto plano para que un trabajador no técnico que lo vea no sepa qué es.

Gracias por cualquier consejo.

+2

estoy tentado a recomendar tirar en un 'str_rot13()' llaman a alguna parte. En una nota más seria, si necesita recuperar la versión descifrada, no puede usar 'md5()' de todos modos, ya que es una función de hash, que casi lo convierte en una encriptación de un solo sentido. – BoltClock

+0

No utilice el cifrado César. Hay muchos algoritmos de cifrado/descifrado pequeños/débiles para elegir que se pueden adaptar para adaptarse a su molde de 12 carbonos. Cifras César son simplemente demasiado fáciles de entender. Eventualmente alcanzarás un patrón que incluso un nudillo-dragger puede ver como un día. –

+0

¿Cuál de ellos sugerirías, Joel? – tiredofcoding

Respuesta

14

Esto es una adición a this answer.

La respuesta propone tomar los primeros doce caracteres de una representación de 32 caracteres de md5. Por lo tanto, se perderán 20 caracteres de información; esto dará como resultado manera colisiones más posibles.

Puede reducir la pérdida de información mediante la adopción de los primeros doce caracteres de una representación de 16 caracteres (la forma en bruto):

substr(md5($string, true), 0, 12); 

Esto mantendrá el 75% de los datos, mientras que el uso de la 32 la forma char solo mantiene el 37.5% de los datos.

+2

Esto da como resultado 12 * bytes *, que no son necesariamente 12 * caracteres * y también es riesgoso usar esto con funciones seguras no binarias, que desafortunadamente todavía son bastante comunes, ya que se truncarán en el primer carácter '\ 0'. – CodesInChaos

+1

¿'md5 ($ string, true)' no devuelve también caracteres no visibles? Creo que esto causará problemas en HTML: el hash podría ser urlencoded por el navegador y cambiar de longitud ... – Philipp

8

Si solo necesita un hash, puede seguir utilizando los primeros 12 caracteres del hash md5.

substr(md5($yourString), 0, 12); 
+0

¡Estaba escribiendo exactamente lo mismo! –

+0

Debo aclarar que todavía necesitamos decodificarlo. Podría haber un caso en el que los primeros 12 caracteres de un md5 sean iguales a los demás. – tiredofcoding

+2

@tiredofcoding: MD5, como cualquier otro hash, es una función unidireccional: * no * puede decodificarlo. Lo que quieres es un cifrado, no un hash. – casablanca

7

Pruebe crc32() maybe?

3

Todas las respuestas sugieren perder algunos de los datos (mayor posibilidad de colisión), pero parece que usar la conversión de base es un mejor enfoque: p. como se describe aquí http://proger.i-forge.net/Short_MD5/OMF

También puede generar cualquier cadena aleatoria e insertarla en la base de datos, verificando si aún no existe antes de guardarla. Esto le permitirá tener hashes cortos y garantizar que no haya colisiones.

3

tengo que poner esta sugerencia a través como tengo que asumir que está en control de la secuencia de comandos que su valor cifrado se envía a ....

También tengo que asumir que se pueden crear muchos campos de formulario pero no pueden tener una longitud mayor a 12 caracteres cada una.

Si ese es el caso, ¿no podría simplemente crear más de un campo de formulario y extender la cadena md5 en múltiples campos ocultos?

Puede dividir la cadena de md5 en trozos de 8 y enviar cada fragmento en un campo de formulario oculto y luego unirlos en el otro extremo.

Solo un pensamiento ...

15

tal vez esto le ayudará a generar una cadena 12 de carbón que se puede pasar en una dirección URL, sin aumentar el riesgo de colisiones

substr(base_convert(md5($string), 16,32), 0, 12); 
+1

Esta debería ser la respuesta aceptada. Es el hash MD5 completo en una representación más compacta. – Deebster

+1

Esto no mantiene el hash MD5 completo ... De acuerdo con los documentos PHP, "Advertencia: base_convert() puede perder precisión en números grandes debido a propiedades relacionadas con el tipo interno" doble "o" flotante "utilizado. En los sistemas de 32 bits, al menos, la conversión de un hexágono de 32 dígitos a base 32 da como resultado que los últimos 16 dígitos se establezcan en 0. Pruébelo: imprima base_convert (md5 ('foo'), 16, 32); resultados en 5cnkcdmj62v000000000000000. – mikeker