password net funcion encrypt php variables encryption cryptography md5

net - sha php



¿Cifrado php más corto que md5? (7)

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.

Quería ocultar ese valor con md5, pero obviamente con 12 caracteres que no van 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 ASCII con x. Por lo tanto, el objetivo no es ocultarlo de un experto en criptografía, sino simplemente no publicarlo en texto simple para que un trabajador no técnico que lo vea no sepa qué es.

Gracias por cualquier consejo.


Esta es una adición a esta respuesta .

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, lo que dará como resultado más colisiones posibles.

Puede reducir la pérdida de información tomando 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 del formulario de 32 caracteres solo mantendrá el 37,5% de los datos.


Probablemente esto no sea de utilidad para el OP, ya que buscaban una función bidireccional, pero pueden ayudar a alguien que busque un hash más corto que md5. Esto es lo que se me ocurrió para mis necesidades (gracias a https://rolandeckert.com/notes/md5 por resaltar la función base64_encode). Codifique el hash md5 como base (64) y elimine los caracteres base no deseados (64). Estoy quitando las vocales + y / reduciendo así la base efectiva de 64 a 52.

Tenga en cuenta que si trunca un hash codificado en base (b) después de los caracteres c, se permitirán b has de hash únicos. ¿Es esto lo suficientemente robusto como para evitar colisiones? Depende de cuantos elementos (k) tengas hash. La probabilidad de colisión es aproximadamente (k * k) / (b ^ c) / 2, por lo tanto, si usó la siguiente función para hacer hash k = 1 millón de elementos con la base b = 52 codificada truncada después de c = 12 caracteres, la probabilidad de colisión es <1 en 750 millones. Compare con el truncamiento del hash codificado (b = 16) después de c = 12 caracteres. La probabilidad de colisión es aproximadamente 1 en 500! Solo di no a truncar hashes codificados en hexadecimal. :)

Iré a una extremidad y diré que la función a continuación (con longitud 12) es razonablemente segura para 10 millones de elementos (<1 en 7,5 millones de probabilidades de colisión), pero si desea estar más seguro, utilice la codificación de base (64) (comenta la matriz $ remove) y / o trunca menos caracteres.

// convert md5 to base64, remove undesirable characters and truncate to $length function tinymd5($str, $length) { // $length 20-22 not advised unless $remove = ''''; // remove vowels to prevent undesirable words and + / which may be problematic $remove = array(''a'', ''e'', ''i'', ''o'', ''u'', ''A'', ''E'', ''I'', ''O'', ''U'', ''+'', ''/''); $salt = $str; do { // re-salt and loop if rebase removes too many characters $salt = $base64 = base64_encode(md5($salt, TRUE)); $rebase = substr(str_replace($remove, '''', $base64), 0, $length); } while ($length < 20 && substr($rebase, -1) == ''=''); return str_pad($rebase, min($length, 22), ''=''); // 22 is max possible length } $str = ''Lorem ipsum dolor sit amet 557726776''; echo ''<br />'' . md5($str); // 565a0bf7e0ba474fdaaec57b82e6504a $x = md5($str, TRUE); echo ''<br />'' . base64_encode($x); // VloL9+C6R0/arsV7guZQSg== echo ''<br />'' . tinymd5($str, 12); // VlL9C6R0rsV7 echo ''<br />'' . tinymd5($str, 17); // VlL9C6R0rsV7gZQSg $x = md5(base64_encode($x), TRUE); // re-salt triggered < 20 echo ''<br />'' . base64_encode($x); // fmkPW/OQLqp7PTex0nK3NQ== echo ''<br />'' . tinymd5($str, 18); // fmkPWQLqp7PTx0nK3N echo ''<br />'' . tinymd5($str, 19); // fmkPWQLqp7PTx0nK3NQ echo ''<br />'' . tinymd5($str, 20); // fmkPWQLqp7PTx0nK3NQ= echo ''<br />'' . tinymd5($str, 22); // fmkPWQLqp7PTx0nK3NQ===


Prueba crc32 () tal vez?


Si solo necesita un hash, aún puede usar los primeros 12 caracteres del hash md5.

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


Tengo que transmitir esta sugerencia ya que debo asumir que usted tiene el control del script al que se envía su valor cifrado a ...

También debo asumir que puedes crear muchos campos de formulario pero no pueden tener una longitud mayor de 12 caracteres cada uno.

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

Puede simplemente dividir la cadena 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...


Todas las respuestas sugieren perder algunos de los datos (posibilidad de colisión más alta), pero parece que usar una conversión base es un mejor enfoque: por ejemplo, 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 guardar. Esto le permitirá tener hashes cortos y garantizar que no haya colisiones.


tal vez esto te ayude a generar una cadena de 12 caracteres que puedes pasar en una URL, sin aumentar el riesgo de colisiones

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