2008-09-19 20 views
12

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 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.¿Cuál es la mejor manera de encriptar una cadena muy corta en PHP?

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

+1

3-20 personajes, esta no es una contraseña, ¿o sí? El cifrado de una vía es casi siempre una mejor opción para las contraseñas. –

Respuesta

4

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 se dijo tanto Chris Kite y arácnido, debido al pequeño tamaño de sus datos se aconseja que la almohadilla los datos y utilizar un vector de inicialización aleatoria.

Actualización: En cuanto a por qué .... si los datos son lo suficientemente pequeña, y la IV se puede predecir, es posible la fuerza bruta del texto sin formato mediante la generación de texto cifrado para cada combinación de llanura -text con el IV conocido y emparejándolo hasta el texto cifrado capturado. En resumen, así es como funcionan las tablas de arcoiris.

Ahora bien, si usted va a cifrar en un servidor y descifrar en otro me gustaría 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 usted es capaz de, sería ayudar 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.

3

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

+6

¿Honestamente solo sugirió ROT13 en una publicación criptográfica? –

+5

Santa mierda, amigo. ¿Puedes leer? "¿Importa si alguien puede descifrarlo?" ROT13 es una encriptación válida. Es trivial de romper, pero eso no necesariamente importa siempre. Estaba lo suficientemente claro sobre eso, ¿no? – Will

0

Algún algoritmo de encriptación de un solo sentido como Blowfish hará, 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.

+0

Corrección: la versión de crypt() no es adecuada porque no tiene una forma de descifrar. Use algo como http://pear.php.net/package/Crypt_Blowfish. Eso te dará la ventaja adicional de no tener que preocuparte por instalar una extensión adicional. – Roel

6

Me gusta usar GnuPG para cualquier cosa que necesite ser encriptada en un servidor y luego posiblemente descifrada 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 algunas envolturas buenas disponibles para varios idiomas (otra ventaja), una para PHP es GnuPGP PHP Class.

2

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 hay muchos factores para un sistema seguro que son difíciles de obtener, 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).

6

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.

Una cosa que puedo decir con certeza: con cadenas de texto cortas, es más importante que nunca que DEBE 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.

1

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 utilice BCE, esto siempre va a producir el mismo resultado para el mismo texto plano.

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

respecto a sus datos, ya que AES es un cifrado de bloques, el resultado es siempre un múltiplo del tamaño de 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.

0

Puede utilizar las ideas generales de programación sin tener que depender en construido en funciones de cifrado/Decription Ejemplo 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 el enlace para incluir el de identificación requerida para ser cifrada

/** 
    *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 consiguen abrir después se hace 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; 
Cuestiones relacionadas