Menú
Está libre
registro
el principal  /  Navegantes/ Cómo cifrar archivos en php. Protección de los scripts PHP del análisis y la modificación

Cómo cifrar archivos en php. Protección de los scripts PHP del análisis y la modificación

Cualquier información se puede cifrar y descifrar, incluso con usando PHP... Este lenguaje tiene muchas opciones para encriptar datos, desde simples hasta complejos.

Considere los métodos de cifrado básicos

base64- le permite cifrar y descifrar datos utilizando el algoritmo MIME base64. No usa claves y se usa a menudo para ocultar enlaces en php.

Ejemplos:
// cifrar el texto
$ text = "Enlace";
echo base64_encode ($ texto); // Produce: PGEgaHJlZj0iIyI + 0KHRgdGL0LvQutCwPC9hPg ==
// descifrar
echo base64_decode ("PGEgaHJlZj0iIyI + 0KHRgdGL0LvQutCwPC9hPg ==");
?>

Como puede ver, primero usamos la operación base64_encode y obtuvimos el cifrado: PGEgaHJlZj0iIyI + 0KHRgdGL0LvQutCwPC9hPg ==, y luego lo sustituyó en base64_decode y recuperó el enlace.

md5- le permite hacer hash de datos unilateralmente. Es decir, a diferencia de base64, ya no podrá descifrarlos. A menudo, md5 se usa para almacenar contraseñas en una base de datos, pero recientemente la combinación md5 encriptada se ha vuelto fácil de encontrar en tablas de desencriptación, cortesía de muchos sitios y algoritmos. Por lo tanto, para almacenar contraseñas md5 es mejor reemplazar los algoritmos con Blowfish.

Ejemplo:

// cifrar el texto
echo md5 ("combinación");
?>

Cifrado de claves

Y el último ejemplo de cifrado / descifrado, del que quería hablar, usa una clave (como contraseña). Es decir, pasa una clave única a la función de cifrado, el código se cifra junto con él. Para descifrar, debe proporcionar a la función un código cifrado y una clave que solo usted conoce. Un ejemplo de uso de funciones en la parte inferior del código.

función __encode ($ texto, $ clave) (



$ enc_text = base64_encode (mcrypt_generic ($ td, $ iv. $ texto));
mcrypt_generic_deinit ($ td);
mcrypt_module_close ($ td);
return $ enc_text; ))
función strToHex ($ cadena) (
$ hex = "";
para ($ i = 0; $ i< strlen($string); $i++) { $hex .= dechex(ord($string[$i])); }
return $ hex; )
función __decode ($ texto, $ clave) (
$ td = mcrypt_module_open ("tripledes", "", "cfb", "");
$ iv_size = mcrypt_enc_get_iv_size ($ td);
$ iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($ td), MCRYPT_RAND);
if (mcrypt_generic_init ($ td, $ clave, $ iv)! = -1) (
$ decode_text = substr (mdecrypt_generic ($ td, base64_decode ($ texto)), $ iv_size);
mcrypt_generic_deinit ($ td);
mcrypt_module_close ($ td);
return $ decode_text; ))
función hexToStr ($ hex) (
$ cadena = "";
para ($ i = 0; $ i< strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); }
return $ cadena; )

$ str = "¡Bollos para encriptar!
Por clave";
$ código = strToHex (__ encode ($ str, "Mi # clave-do-36-simvolov"));
echo "Código cifrado:". $ código ".
";

$ str = __decode (hexToStr ($ código), "Mi # key-do-36-simvolov");
echo "Código decodificado:". $ str. "
";
?>

Puede cifrar con contenido html. La longitud de la clave no debe superar los 36 caracteres.

Este método se puede utilizar para cifrar algunos datos y ponerlos en un archivo txt o base de datos, y obtenerlos mediante el descifrado con una clave.

Por supuesto, cualquier código puede ser descifrado / pirateado y este no es una excepción, así que use métodos de cifrado fuertes.

Digamos que desea intercambiar datos entre dos servidores. Para proteger los datos del tráfico de escuchas clandestinas, los datos están encriptados. Bueno, por ejemplo, transferir acciones dentro de una botnet. Esto es lo que esencialmente no es encriptación, sino que se llama codificación, y se utilizan funciones bien conocidas para decodificar dicho código.

Como otro ejemplo de pseudoencriptación, daré un ejemplo de "encriptación" de contraseñas en la base de datos de un CMS - allí las contraseñas no están encriptadas en md5 () o, sino simplemente codificadas a través de base64. Esos. cuando se filtra la base de datos, no será difícil para un pirata informático descifrar todas las contraseñas a través de la función php incorporada base64_decode ().

Necesitamos transferir datos sin preocuparnos de que alguien pueda interceptar el texto y descifrarlo. PHP tiene el popular paquete de cifrado de datos Mcrypt, que proporciona cifrado bidireccional (es decir, el cifrado y descifrado de datos reales).

La versión 2.4.7 de Mcrypt admite los siguientes algoritmos de cifrado simétrico: Blowfish, RC2, Safer-sk64 xtea, Cast-256, RC4, Safer-sk128, DES, RC4-iv, Serpent, Enigma, Rijndael-128, Threeway, Rijndael-192 , TripleDES, LOKI97, Rijndael-256, Twofish, Panamá, Saferplus, etc. Más detalles sobre cada algoritmo están escritos en Wikipedia.

Dado que se utiliza cifrado simétrico, la clave debe ser conocida por ambas partes y debe mantenerse en secreto.

Un ejemplo de cifrado y descifrado de una cadena

mcrypt_module_open ("des", "", "ecb", "")
Esta función abre el módulo de algoritmo y el modo utilizado. Para este ejemplo, algoritmo DES en modo ECB.

$ clave = substr ($ clave, 0, mcrypt_enc_get_key_size ($ td));
El tamaño máximo de clave debe obtenerse llamando a la función mcrypt_enc_get_key_size (), y todo valor menor que el obtenido será correcto.

$ s = mcrypt_generic ($ td, $ fuente);
Cuando se cifran, los datos se rellenan con cero bytes para garantizar la longitud de los datos en n * tamaño de bloque. El tamaño del bloque está determinado por el algoritmo (para DES, el tamaño del bloque es de 64 bits). Por lo tanto, durante el descifrado, puede aparecer "\ 0" al final de la línea, que se elimina con la función trim ().

Una de las verdades básicas de la criptografía es que no debes inventar nada en esta área si no eres un profesional. Esto es en parte cierto, porque todo lo mejor se ha inventado durante mucho tiempo, se ha logrado a través del sufrimiento y se ha utilizado durante más de una docena de años en el campo. tecnologías de la información... La otra cara de la verdad es que el desarrollo de una determinada área del conocimiento se produce solo con una afluencia constante de ideas frescas y soluciones originales en ella.

Por razones obvias, no apuntaremos a los gigantes de la criptografía industrial como AES, sino que nos sumergiremos, por así decirlo, en nuestra propia investigación criptográfica con blackjack y diversión.

En parte porque es interesante, en parte porque al modelar algo propio y compararlo con estándares reconocidos, puede ver claramente el contraste, las soluciones efectivas y las omisiones absolutas, y comprende lo que puede esforzarse por mejorar la eficiencia.

Pero ya hay suficiente agua.

Digamos que nuestra aplicación web está escrita en php, necesita un cifrado reversible y creemos que podemos escribir nuestro propio sistema de cifrado.

Así que vamos a escribir propio sistema cifrado reversible con una clave pública y privada, una que tendrá las siguientes características de un algoritmo criptográfico ligeramente seguro:

  1. La presencia de símbolos de ruido en el cifrado final.
  2. La información de cada canal de remitente-destino se cifrará mediante una clave privada y la función de coincidencia será única para cada clave.
  3. Cada mensaje recibirá un código de resumen, un código único que es una función de la clave privada y el mensaje original. Esto es necesario para lograr la unicidad de la función de coincidencia "símbolo fuente<=>carácter codificado "no solo para el canal Remitente-Destinatario, sino también para cada mensaje individual.

    Por lo tanto, incluso si imaginamos que la correspondencia de los caracteres codificados y originales para un mensaje en particular se ha conocido mediante el uso de análisis criptográfico, por ejemplo, análisis de frecuencia, esto no da ninguna preferencia al examinar otro mensaje.

  4. Para complicar el análisis de frecuencia, codificaremos cada símbolo de mensaje original con dos símbolos de cifrado.
Entonces qué pasó.

De hecho, puedes ver el resultado final

La clase SymCoder incluye métodos de cifrado y descifrado.

El cifrado se realiza mediante el método code (), que acepta el mensaje original como entrada.

Aquí, el mensaje en la tabla de búsqueda generada en tab_coded crea un mensaje cifrado, diluido alrededor de los bordes y en el interior con símbolos de ruido.

Por cierto, los símbolos de ruido son únicos para cada canal emisor-destino, ya que se generan usando la clave del canal, pero no son únicos para los mensajes. Los símbolos utilizados para el cifrado en code_symbols son algunos signos de puntuación y símbolos como%, @, etc.

Para cada símbolo codificado, hay dos símbolos de code_symbols por razones obvias de que hay varias veces menos de ellos que los símbolos codificados.

La tabla de correspondencia create_tab_coded se construye utilizando la traducción del hash de la clave del mensaje en una matriz con el número de elementos igual al número de elementos en la matriz de símbolos de código. La posición del inicio de la omisión de códigos de dos caracteres también es siempre diferente y está asociada con la tecla de canal. Esto hace posible estar seguro de que el algoritmo para omitir los símbolos codificados y hacerlos coincidir con los símbolos de código siempre (bueno, o garantizado a menudo) será diferente.

Por ejemplo, el mensaje "hola mundo", cuando se codifica, se ve así:

[correo electrónico protegido]@=!=-.?&1.#&?=:.:.1%!&-%@[correo electrónico protegido]%~&1^#=?%%.!%+.?.~=?..&?%&&:%~.#%@&1&1.#=?.#.?.!&1==&=.-=!

Y aquí está el mismo mensaje, codificado de nuevo:

Digest-a00bf11d - =:.? =: &!.?. 1 & - =: =?.?. =.?.! & =%! = -% @ =!% ~. = ^ #. 1 %% .!% + =: [correo electrónico protegido]==%&&1%~.1%@[correo electrónico protegido][correo electrónico protegido]=:&1.==:=!.1&:

Se puede ver que el resumen del mismo mensaje es el mismo, pero el cifrado se vuelve diferente: los símbolos de ruido se agregan mediante una coincidencia arbitraria y en un orden arbitrario para cada nuevo cifrado.

Los mensajes tienen redundancia, que disminuye a medida que aumenta el volumen del mensaje, alcanzando hasta un 10% de ruido (para los mensajes más cortos, el ruido alcanza el 90% y más), la longitud mínima de un mensaje cifrado es de 116 caracteres. Uno de los pocos contras este método cifrado: aumentar los mensajes cifrados al menos dos veces.

La decodificación consiste en la traducción inversa de la forma "símbolo de código", el símbolo original con la eliminación del ruido del mensaje. ¿Cuál podría ser la clave? Básicamente, cualquier cadena que sea única para cada par de destinatario-destinatario.

Por ejemplo, si está creando un mensajero con mensajes encriptados, entonces la opción más simple es llave privada tal vez md5 ($ user_id_1. $ salt. $ user_id_2), entonces la clave será única para cada canal de mensajes.

(PHP 4, PHP 5, PHP 7)

crypt - Hash de cadena unidireccional

Advertencia

¡Esta función no es (todavía) binaria segura!

Descripción

cripta (cadena $ str [, cadena $ sal]): cuerda

cripta () devolverá una cadena hash utilizando el algoritmo estándar basado en DES de Unix o algoritmos alternativos que pueden estar disponibles en el sistema.

El parámetro de sal es opcional. Sin embargo, cripta () crea un hachís débil sin sal. PHP 5.6 o posterior genera un error E_NOTICE sin él. Asegúrese de especificar una sal lo suficientemente fuerte para una mayor seguridad.

contraseña_hash () usa un hachís fuerte, genera una sal fuerte y aplica las rondas adecuadas automáticamente. contraseña_hash () es un simple cripta () contenedor y compatible con hashes de contraseña existentes. Uso de contraseña_hash () es animado.

Algunos sistemas operativos admiten más de un tipo de hash. De hecho, a veces el algoritmo estándar basado en DES se reemplaza por un algoritmo basado en MD5. El tipo de hash se activa mediante el argumento salt. Antes de 5.3, PHP determinaba los algoritmos disponibles en el momento de la instalación en función de la cripta () del sistema. Si no se proporciona sal, PHP generará automáticamente una sal estándar de dos caracteres (DES) o una sal de doce caracteres ( MD5), dependiendo de la disponibilidad de MD5 crypt (). PHP establece una constante llamada CRYPT_SALT_LENGTH que indica la sal válida más larga permitida por los hashes disponibles.

El estándar basado en DES cripta () devuelve la sal como los dos primeros caracteres de la salida. También usa solo los primeros ocho caracteres de str, por lo que las cadenas más largas que comienzan con los mismos ocho caracteres generarán el mismo resultado (cuando se usa la misma sal).

En sistemas donde la función crypt () admite múltiples tipos de hash, las siguientes constantes se establecen en 0 o 1 dependiendo de si el tipo dado está disponible:

  • CRYPT_STD_DES- Hash estándar basado en DES con una sal de dos caracteres del alfabeto "./0-9A-Za-z". El uso de caracteres no válidos en la sal hará que crypt () falle.
  • CRYPT_EXT_DES- Hash extendido basado en DES. La "sal" es una cadena de 9 caracteres que consta de un guión bajo seguido de 4 bytes de recuento de iteraciones y 4 bytes de sal. Estos están codificados como caracteres imprimibles, 6 bits por carácter, primero el carácter menos significativo. Los valores de 0 a 63 se codifican como "./0-9A-Za-z". El uso de caracteres no válidos en la sal hará que crypt () falle.
  • CRYPT_MD5- Hash MD5 con una sal de doce caracteres que comienza con $ 1 $
  • CRYPT_BLOWFISH- Hashing de Blowfish con una sal de la siguiente manera: "$ 2a $", "$ 2x $" o "$ 2y $", un parámetro de costo de dos dígitos, "$" y 22 caracteres del alfabeto "./0-9A- Za-z ". El uso de caracteres fuera de este rango en la sal hará que crypt () devuelva una cadena de longitud cero. El parámetro de costo de dos dígitos es el logaritmo en base 2 del recuento de iteraciones para los algoritmos hash subyacentes basados ​​en Blowfish y debe estar en el rango 04-31, los valores fuera de este rango harán que crypt () falle. Las versiones de PHP anteriores a 5.3.7 solo admiten "$ 2a $" como prefijo salt: PHP 5.3.7 introdujo los nuevos prefijos para corregir una debilidad de seguridad en la implementación de Blowfish. Consulte para obtener todos los detalles de la corrección de seguridad, pero para resumir, los desarrolladores que se dirijan solo a PHP 5.3.7 y posteriores deben usar "$ 2y $" en lugar de "$ 2a $".
  • CRYPT_SHA256- Hash SHA-256 con una sal de dieciséis caracteres con el prefijo $ 5 $. Si la cadena de sal comienza con "rondas =
  • CRYPT_SHA512- Hash SHA-512 con una sal de dieciséis caracteres con el prefijo $ 6 $. Si la cadena de sal comienza con "rondas = $ ", el valor numérico de N se usa para indicar cuántas veces se debe ejecutar el bucle de hash, al igual que el parámetro de costo en Blowfish. El número predeterminado de rondas es 5000, hay un mínimo de 1000 y un máximo de 999,999,999. Cualquier selección de N fuera de este rango se truncará al límite más cercano.

A partir de PHP 5.3.0, PHP contiene su propia implementación y la usará si el sistema carece de soporte para uno o más de los algoritmos.

Parámetros

La cadena a la que se le aplicará el hash.

Precaución

Utilizando la CRYPT_BLOWFISH algoritmo, dará como resultado que el parámetro str se trunque a una longitud máxima de 72 caracteres.

Una cadena de sal opcional para basar el hash. Si no se proporciona, el comportamiento lo define la implementación del algoritmo y puede dar lugar a resultados inesperados.

Valores devueltos

Devuelve la cadena con hash o una cadena de menos de 13 caracteres y se garantiza que diferirá de la sal en caso de falla.

Advertencia

Al validar contraseñas, se debe utilizar una función de comparación de cadenas que no sea vulnerable a los ataques de tiempo para comparar la salida de cripta () al hash conocido anteriormente. PHP 5.6 en adelante proporciona hash_equals () para este propósito.

Registro de cambios

Versión Descripción
5.6.5 Cuando se proporciona la cadena de error "* 0" como sal, ahora se devolverá "* 1" para mantener la coherencia con otras implementaciones de criptas. Antes de esta versión, PHP 5.6 devolvería incorrectamente un hash DES.
5.6.0 Genere la advertencia de seguridad E_NOTICE si se omite la sal.
5.5.21 Cuando se proporciona la cadena de error "* 0" como sal, ahora se devolverá "* 1" para mantener la coherencia con otras implementaciones de criptas. Antes de esta versión, PHP 5.5 (y ramas anteriores) devolvía incorrectamente un hash DES.
5.3.7 Agregado $ 2x $ y $ 2y $ Modos Blowfish para hacer frente a posibles ataques de bits altos.
5.3.2 Se agregaron las criptas SHA-256 y SHA-512 basadas en la implementación de Ulrich Drepper.
5.3.2 Se corrigió el comportamiento de Blowfish en rondas no válidas para devolver una cadena de "falla" ("* 0" o "* 1"), en lugar de recurrir a DES.
5.3.0 PHP ahora contiene su propia implementación para la cripta MD5, Standard DES, Extended DES y los algoritmos Blowfish y lo usará si el sistema carece de soporte para uno o más de los algoritmos.

Ejemplos de

Ejemplo 1 cripta () ejemplos

$ hashed_password = crypt ("mi contraseña"); // deja que la sal se genere automáticamente

/ * Debería pasar todos los resultados de crypt () como la sal para comparar un
contraseña, para evitar problemas cuando se utilizan diferentes algoritmos hash. (Como
dice arriba, el hash de contraseña estándar basado en DES usa una sal de 2 caracteres,
pero el hash basado en MD5 usa 12.) * /
if (hash_equals ($ hashed_password, crypt ($ user_input, $ hashed_password))) (
echo "¡Contraseña verificada!" ;
}
?>

Ejemplo # 2 Usando cripta () con htpasswd

// Establecer la contraseña
$ contraseña = "mi contraseña";

// Obtener el hash, dejando que la sal se genere automáticamente
$ hash = cripta ($ contraseña);
?>

Ejemplo # 3 Usando cripta () con diferentes tipos de hash

/ * Estas sales son solo ejemplos y no deben usarse textualmente en su código.
Debe generar un salt distinto y con el formato correcto para cada contraseña.
*/
si (CRYPT_STD_DES == 1) (
echo "DES estándar:". cripta ("rasmuslerdorf", "rl"). "\ n";
}

si (CRYPT_EXT_DES == 1) (
echo "Extended DES:". cripta ("rasmuslerdorf", "_J9..rasm"). "\ n";
}

si (CRYPT_MD5 == 1) (
echo "MD5:". cripta ("rasmuslerdorf", "$ 1 $ rasmusle $"). "\ n";
}

si (CRYPT_BLOWFISH == 1) (
echo "Pez globo:". cripta ("rasmuslerdorf", "$ 2a $ 07 $ usesomesillystringforsalt $"). "\ n";
}

si (CRYPT_SHA256 == 1) (
echo "SHA-256:". cripta ("rasmuslerdorf", "$ 5 $ rondas = 5000 $ usesomesillystringforsalt $"). "\ n";
}

si (CRYPT_SHA512 == 1) (
echo "SHA-512:". cripta ("rasmuslerdorf", "$ 6 $ rondas = 5000 $ usesomesillystringforsalt $"). "\ n";
}
?>