Pregunta sobre obfuscation, encryption, php, encoding – Ofuscar o cifrar algunos datos de texto sin formato en PHP

12

Necesito ofuscar o cifrar algunos datos de texto sin formato en mi aplicación php 5.2.

Prefiero una solución que tenga una cadena de entrada y una cadena de salida que conserven la misma longitud.

Esto no necesita ser extremadamente fuerte, ya que hay muchas otras capas de seguridad en su lugar. Fuerte sería bueno, pero esto solo evitará que los programadores / dba / support people / etc lean accidentalmente el texto desde la base de datos.

consideraciones clave

EDITAR AÑADIR Prefiero una solución que tenga una cadena de entrada y una cadena de salida que conserven la misma longitud.solo el texto de la cadena será confuso / cifrado para el almacenamiento en una base de datosla aplicación php necesitará ofuscar / cifrar los datos antes de guardar la base de datos y deberá desenfocar / dencrypt después de leer la base de datosEsta es una modificación de una aplicación existente.solo algunas columnas tendrán que ser ofuscadas / encriptadassolo algunas filas tendrán que ser ofuscadas / encriptadas, basadas en un campo Tipohay solo unos pocos puntos de carga / ahorro para manejarel tamaño máximo de la columna ya está determinado para algunos campos, pero no para otros, pero preferiría una solución que funcione dentro del tamaño existente de los campos restringidosEDITAR, AGREGAR la clave probablemente será un compuesto de información de la clave principal + campos no editables

Aquí hay una tabla de base de datos de muestra y datos:

<code>int           char(1) varchar(24)              int      date
MyPrimaryKey  RowType UserText                 UserNo   DateChange
------------  ------- ------------------------ -------- ----------------
1             N       nothing special here     43       6/20/2009 12:11am
2             N       same thing, wow!         78       6/23/2009 1:03pm
3             S       fBJKg}[email protected] 43       6/25/2009 6:45am
4             N       same old, same old text  21       6/25/2009 8:11am
</code>

La aplicación cargaría y mostraría las filas 1,2 y 4 normalmente. Sin embargo, condicionalmente (en función del tipo de fila) manejaría el texto en la fila 3 usando esta lógica de ofuscación / cifrado y no ofuscación / descifrado.

¿Alguien puede proporcionar código de funciones, enlaces y / o punteros de ofuscación / cifrado y no ofuscación / descifrado que ayuden aquí?

¡Gracias!

EDITAR
Me gusta la idea de codificación simple de base64, pero hay un método que puede mantener los datos dentro de un tamaño fijo. Todos los métodos enumerados hasta ahora tienen el valor de salida más grande que el valor de entrada. Esto será un problema para algunas columnas, donde el usuario puede ingresar 50 caracteres y se almacena en una columna varchar (50).

@pure_code, en 2009, simplemente no quería ver los datos en el curso de soporte de la aplicación. Esto no fue de ninguna manera un intento de asegurar los datos. KM.
@Wadih M., los requisitos dados para este proyecto son almacenar esto como texto sin formato en la base de datos y limitar el acceso de los usuarios a través de la aplicación. Voy a ir más allá de eso, con una funcionalidad mínima / simple de ofuscación / cifrado porque no quiero "ver" los datos cuando trabajo en el sistema. Con acceso completo al código fuente, cualquiera de los otros desarrolladores podrá descubrir cómo está codificado, y pueden hacerlo si lo desean, pero probablemente tampoco quieran hacerlo. Si lo hacen, entonces no hay gran problema, no estamos almacenando datos de alto secreto. KM.
Tengo la misma situación y solo voy a hacer una simple rot13. user1637281
Si no puede confiar en las personas que tienen acceso directo a sus sistemas y su base de datos, debe ser más restrictivo en cuanto a quién puede acceder a los sistemas u obtener personas diferentes. Sean McSomething

Tu respuesta

7   la respuesta
4

Si tiene instalado mcrypt (todos mis entornos PHP actuales tienen), podría usarmcrypt_encrypt ymcrypt_decrypt Me gusta esto:

<code>function encrypt ($text) {
  global $key;
  return mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, "abcdefghijklmnopqrstuvwxyz012345");
}

function decrypt ($secret) {
  global $key;
  return rtrim (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $key, $secret, MCRYPT_MODE_ECB, "abcdefghijklmnopqrstuvwxyz012345"), "\0");
}
</code>

que utiliza un global$key y AES (muy fuerte).

Los inconvenientes son el rendimiento (en comparación con los más simples como Base64) y que de alguna manera hay que arreglar una clave.

Aclamaciones,

3

Si está utilizando mysql en torno a la versión 5, entonces ni siquiera necesita mucho php, puede hacerlo dentro de su consulta con las funciones de cadena de mysql.encrypt(text, password) ydecrypt(text, password)

http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

DECODE(crypt_str,pass_str)

Descifra la cadena cifrada crypt_str usando pass_str como la contraseña. crypt_str debe ser una cadena devuelta desde ENCODE ().

ENCODE(str,pass_str)

Encripta str usando pass_str como la contraseña. Para descifrar el resultado, use DECODE ().

El resultado es una cadena binaria de la misma longitud que str.

La fuerza del cifrado se basa en la calidad del generador aleatorio. Debería ser suficiente para cuerdas cortas.

actualización: otra posibilidad seríarot13 ^^

pero rot13 puede ser bastante legible, para algunos. daver
Realmente me gusta la misma salida de cadena de longitud, sin embargo, no estoy en mysql. El rot13 parece prometedor KM.
rot13 es perfecto si necesitas algo que no se pueda leer pero que no se pueda hackear. user1637281
Rot13 fue de hecho una broma. rot13 SIEMPRE es una broma ^^ stefs
7

Qué tal sicodificación base64? Usamos para usar eso para hacer que los mensajes SMS en nuestra base de datos de SMS Gateway sean ilegibles para los desarrolladores.

Cualquiera puede decir a primera vista que se usa la base 64 y decodificarla en un segundo. ¿Cómo hace eso SMS "ilegible"? dusoft
base64 hace el texto más largo, no la misma longitud ... Lucas - Better Coding Academy
@dusoft: su SMS está destinado a ser "ilegible". =) David Thomas
oO ¿Empleas desarrolladores que no pueden detectar y decodificar base64? (Sólo bromeo, no pude resistir ...) VolkerK
2

Trate de usar la biblioteca mcrypt. No se incluye con PHP estándar, pero se puede descargar fácilmente y se usa con mucha frecuencia. Aquí estáun tutorial rápido en lo que puedes hacer con eso.

Es mejor asegurarse de que la clave que usa para el cifrado se almacena en un lugar seguro, pero si no está realmente preocupado por la seguridad, probablemente esté bien, simplemente inserte la clave en su código en algún lugar.

5

Hay algunas opciones.

Si quieres muy fuerte, puedes mirar enmcrypt.

Pero si solo es así, los desarrolladores que trabajan no pueden leer el texto sin un poco de trabajo para hacerlo. Entonces podrías simplementeBASE64 lo codifica ouuencode

4

Prueba estas funciones de PHPconvert_uuencode yconvert_uudecode:

<code>function encrypt_decrypt ($data, $encrypt) {
    if ($encrypt == true) {
        $output = base64_encode (convert_uuencode ($data));
    } else {
        $output = convert_uudecode (base64_decode ($data));
    }
    return $output;
}

$enc_txt = encrypt_decrypt ("HELLO DATA", true);
echo $enc_txt."\n"; // KjIkNSwzJFxAMSQlNDAwYGAKYAo=
echo encrypt_decrypt ($enc_txt, false); // HELLO DATA
</code>
¿Por qué ignoraste la palabra 'longitud'? Vishal Kumar Sahu
Las funciones no lo requieren. atiruz
17

para ofuscación simple use strtr () - Traduzca ciertos caracteres:
cuerdastrtr (string $ str, string $ from, string $ to)

para codificar en php:

<code>$readable='This is a special test string ABC123 ([+,-!#$%&*])';    
$unreadable=strtr($readable,' !"#$%&\'()*+,-./0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
                           ,'¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&\'()*+,-./0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ '
                      );
print $unreadable; //outputs: "ÕéêôAêôAâAôñæäêâíAõæôõAôõóêïèAÂÃIJ³´A©Ü¬­®¢¤¥¦§«Þª"
</code>

para decodificar en php

<code>$unreadable='ÕéêôAêôAâAôñæäêâíAõæôõAôõóêïèAÂÃIJ³´A©Ü¬­®¢¤¥¦§«Þª';
$readable=strtr($unreadable,'¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&\'()*+,-./0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ '
                           ,' !"#$%&\'()*+,-./0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'

               );
print $readable; //outputs: "This is a special test string ABC123 ([+,-!#$%&*])"
</code>

puede replicar fácilmente esta lógica en la base de datos si es necesario (sin hacer un bucle):Usando una tabla de números, por Erland Sommarskog

@pure_code, del manual: la codificación ROT13 simplemente cambia cada letra en 13 lugares en el alfabetodejando sin tocar los caracteres no alfa. La codificación y la decodificación se realizan mediante la misma función, al pasar una cadena codificada como argumento se devolverá la versión original. esto no fue mucho más difícil, pero hace que sea mucho más difícil obtener información de la cadena codificada. KM.
¿Cómo elegiste o generaste las cadenas que usas arriba? Rot13 parece más simple, ¿por qué la complejidad agregada? user1637281
Realmente me gusta la idea base 64, pero necesito que los datos se ajusten a los campos de bases de datos existentes. El rot13 () era bastante simple y mantenía el mismo tamaño, pero este strtr () es lo suficientemente bueno para mi propósito. KM.
Sí, lo sé. Lo que preguntaba es cómo generaste las dos cadenas. Soy demasiado perezoso para contar, pero parece que tomó ASCI (256 caracteres) y cambió 128 caracteres user1637281
Probablemente algo así, si tienes una tabla de números es simple usando CHAR, algo en las líneas deselect char(number) from numbers where number<255 KM.

Preguntas relacionadas