password_hash encriptar encriptada ejemplo desencriptar contraseña con archivos php encryption

encriptar - login con contraseña encriptada php



¿Cuál es la mejor manera de encriptar una cadena muy corta en PHP? (8)

Me gustaría encriptar cadenas que potencialmente solo podrían tener unos tres o cuatro caracteres, pero que se ejecutan a unos veinte caracteres. Una función de hash ( md5 , sha1 , crypt , etc.) no es adecuada ya que me gustaría poder descifrar la información también. La extensión mcrypt tiene una enorme variedad de posibilidades.

¿Alguien tiene alguna idea sobre la mejor manera de cifrar de manera segura cadenas cortas y por qué ? ¿Alguien tiene enlaces a cualquier material que presente a un programador casual en escenarios prácticos de encriptación?


Algún algoritmo de encriptación de un solo sentido como Blowfish servirá, supongo. Blowfish es rápido y abierto. Puedes usar Blowfish a través de la función crypt (). AFAIK no hay algoritmo de encriptación que funcione especialmente bien en cadenas pequeñas. Sin embargo, una cosa a tener en cuenta es que la fuerza bruta de cuerdas tan pequeñas será muy fácil. Tal vez deberías encriptar la cadena junto con un valor de sal ''secreto'' para mayor seguridad.


Me gusta utilizar GnuPG para todo lo que necesite cifrarse en un servidor y luego descifrarlo en el servidor o en otro servidor (que generalmente es mi caso). Esto permite un nivel de seguridad adicional ya que en mi caso el servidor de encriptación no tiene la clave para descifrar los datos. También permite una descifrado manual más sencillo. Hay algunos buenos contenedores disponibles para varios idiomas (otra ventaja), uno para PHP es GnuPGP PHP Class .


mcrypt está vinculado a la mayoría de las compilaciones de PHP de forma predeterminada. Contiene todos los primitivos que probablemente necesites. Sin saber más sobre lo que está encriptando, cuál es su modelo de amenaza, etc., es difícil dar recomendaciones concretas sobre qué algoritmo, modo de operación, etc. usar.

Algo que puedo decir con certeza: con cadenas cortas de texto, es más vital que nunca que DEBES usar un vector de inicialización único y aleatorio. De lo contrario, es trivial que alguien monte una variedad de ataques contra los datos encriptados.


Estoy de acuerdo con Chris Kite, solo use AES 128, esto es suficiente.

No conozco exactamente su entorno, pero supongo que está transmitiendo los datos de alguna manera a través de Internet.

No use ECB, esto siempre producirá el mismo resultado para el mismo texto sin formato.

El modo CBC es el camino a seguir y no se olvide de un vector de inicialización aleatorio. Este vector debe ser comunicado con el texto de cifrado y puede enviarse en forma clara.

Con respecto a sus datos, dado que AES es un cifrado de bloques, el resultado siempre es un múltiplo del tamaño del bloque. Si no quiere que el observador sepa si sus datos son cortos o largos, agregue algo de relleno para extenderlo hasta el tamaño máximo esperado.


Recomiendo encarecidamente las sugerencias de Chris Kite . Sin saber más acerca de lo que está haciendo, por qué, y las amenazas que anticipa necesitar para protegerse contra AES-128 es suficiente. La capacidad de utilizar el cifrado simétrico es excelente para una aplicación independiente que será tanto el desencriptador como el cifrador de datos. Como dijeron tanto Chris Kite como Arachnid , debido al pequeño tamaño de sus datos, se recomienda rellenar los datos y usar un Vector de inicialización aleatorio.

Actualización: En cuanto a por qué ... si los datos son lo suficientemente pequeños y el IV puede predecirse, es posible aplicar fuerza bruta al texto sin formato generando texto cifrado para cada combinación de texto sin formato con el IV conocido y la coincidencia hasta el texto de cifrado capturado. En resumen, así es como funcionan las tablas de arcoiris.

Ahora si va a encriptar en un servidor y descifrar en otro, iré con las sugerencias de pdavis . Al utilizar un método asimétrico, puede separar las claves de cifrado de las claves de descifrado. De esta forma, si el servidor que encripta los datos se ve comprometido, el atacante aún no puede descifrar los datos.

Si puede, ayudaría a la comunidad a saber más sobre su caso de uso para el cifrado. Como mencioné anteriormente, tener una comprensión adecuada de las amenazas plausibles es clave cuando se evalúan los controles de seguridad.


¿Importa si alguien puede descifrarlo? Si solo intentas ofuscarlo un poco , usa ROT13. Es vieja escuela.


Puede usar las ideas generales de programación sin depender de las funciones integradas de cifrado / descripción. Crear una función llamarlo

function encryptstring($string) { $string_length=strlen($string); $encrychars=""; /** *For each character of the given string generate the code */ for ($position = 0;$position<$string_length;$position++){ $key = (($string_length+$position)+1); $key = (255+$key) % 255; $get_char_to_be_encrypted = SUBSTR($string, $position, 1); $ascii_char = ORD($get_char_to_be_encrypted); $xored_char = $ascii_char ^ $key; //xor operation $encrypted_char = CHR($xored_char); $encrychars .= $encrypted_char; } /** *Return the encrypted/decrypted string */ return $encrychars; }

En la página con un enlace para incluir la identificación requerida para ser encriptada

/** *While passing the unique value to a link *Do the following steps */ $id=57;//or if you are fetching it automatically just pass it here /** *For more security multiply some value *You can set the multiplication value in config file */ $passstring=$id*346244; $encrypted_string=encryptstring($passstring); $param=urlencode($encrypted_string); /** *Derive the url for the link */ echo ''<a href="target_file.php?aZ98#9A_KL=''.$param.''">something</a>'' ;

En el archivo de destino que se abre después de hacer clic en el enlace

/** *Retriving the value in the target file *Do the following steps */ $fetchid=$_GET[''aZ98#9A_KL'']; $passstring=urldecode(stripslashes($fetchid)); $decrypted_string= encryptstring($passstring); /** *Divide the decrypted value with the same value we used for the multiplication */ $actual_id= $decrypted_string/346244;


Si desea cifrar y descifrar datos dentro de una aplicación, lo más probable es que desee utilizar un cifrado de clave simétrica. AES, que es el algoritmo de encriptación de bloques simétricos certificado por la NSA para asegurar datos de alto secreto, es su mejor opción. Existe una implementación pura de PHP disponible en www.phpaes.com

Para su uso, parece que AES128 es suficiente. Querrá utilizar el modo CBC con un vector de inicialización aleatorio, o bien los mismos datos siempre producirán el mismo texto cifrado.

Elegir el algoritmo de encriptación correcto es un buen primer paso, pero existen muchos factores para un sistema seguro que son difíciles de corregir, como la administración de claves. Existen buenos recursos, como Applied Cryptography de Bruce Schneier, y Security Engineering de Ross Anderson (disponible de forma gratuita en línea).