Pregunta ofuscar o encriptar algunos datos de texto plano en PHP


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

Preferiría una solución que tuviera cadena de entrada y cadena de salida para mantener la misma longitud.

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

consideraciones clave

  • EDITAR ADD Preferiría una solución que tuviera cadena de entrada y cadena de salida para mantener la misma longitud.
  • solo el texto de cadena se ofuscará / cifrará para su almacenamiento en una base de datos
  • la aplicación php deberá ofuscar / encriptar los datos antes de guardar la base de datos y deberá des-ofuscarse / desnaturalizarse siguiendo la base de datos leída
  • esto es una modificación a una aplicación existente
  • solo algunas columnas necesitarán estar ofuscadas / encriptadas
  • solo algunas filas deberán estar ocultas / encriptadas, según un campo Tipo
  • solo hay unos pocos puntos de carga / guardado para manejar
  • El tamaño máximo de la columna ya está determinado para algunos campos, pero no para otros, pero preferiría que una solución funcione dentro del tamaño existente de los campos restringidos.
  • EDITAR, AGREGAR la clave será probablemente un compuesto de algunos campos de información de clave primaria + campos no editables

aquí hay una tabla de muestra de muestra y datos:

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}.jkjWfF78dlg@45kjg 43       6/25/2009 6:45am
4             N       same old, same old text  21       6/25/2009 8:11am

La aplicación cargaría y mostraría las filas 1,2 y 4 normalmente. Sin embargo, condicionalmente (según el tipo de fila) maneja 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 ofuscación / cifrado y desenmascaramiento / descifrado de funciones, enlaces o puntero que ayudaría aquí?

¡Gracias!

EDITAR
Me gusta la idea simple de codificación base64, pero ¿existe algún método que pueda mantener los datos dentro de un tamaño fijo? Todos los métodos enumerados hasta ahora tienen un valor de salida mayor 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).


10
2018-06-25 12:25


origen


Respuestas:


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

codificar en php:

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

decodificar en php:

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

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

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


16
2018-06-26 20:48



Qué tal si codificación base64? Usamos para usar eso para hacer que los mensajes SMS en nuestro SMS Gateway DB sean ilegibles para los desarrolladores.


7
2018-06-25 12:28



Hay algunas opciones.

Si quieres muy fuerte, podrías mirar mcrypt.

Pero si solo funciona, los desarrolladores no pueden leer el texto sin algo de trabajo para hacerlo. Entonces podrías simplemente BASE64 lo codifica o uuencode it


5
2018-06-25 12:31



Si tienes mcrypt instalado (tienen todos mis entornos PHP actuales), podrías usar mcrypt_encrypt y mcrypt_decrypt Me gusta esto:

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");
}

que usa un sistema 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 tiene que arreglar una clave.

Aclamaciones,


3
2018-06-25 12:34



Si estás utilizando mysql en la versión 5, entonces ni siquiera necesitas mucho php, puedes hacerlo dentro de tu consulta con las funciones de cadena mysql encrypt(text, password) y decrypt(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 contraseña. crypt_str debe ser una cadena devuelta por ENCODE ().

  • ENCODE(str,pass_str)

    Encriptar 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 qué tan bueno es el generador aleatorio. Debería ser suficiente para cadenas cortas.

actualización: otra posibilidad sería rot13 ^^


3
2018-06-25 14:58



Prueba estas funciones de PHP convert_uuencode y convert_uudecode:

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

3
2018-03-25 20:15



Intenta usar la biblioteca mcrypt. No está incluido con PHP estándar, pero se puede descargar fácilmente y se usa muy comúnmente. Aquí está un tutorial rápido en lo que puedes hacer con eso

Lo mejor es asegurarse de que la clave que utiliza para el cifrado esté almacenada en un lugar seguro, pero si no está realmente preocupado por la seguridad, probablemente esté bien simplemente codificando la clave en su código en alguna parte.


2
2018-06-25 12:32



Preguntas populares