Pregunta

  

Duplicar posible:
   cifrado de 2 vías: necesito almacenar las contraseñas que se pueden recuperar

planeo para almacenar información de la cuenta externa para mis usuarios en mi sitio web, también conocido como nombre de usuario y contraseñas rapidshare, etc ... Quiero mantener la información segura, pero sé que si su información de hash, no puedo recuperarlo para su uso posterior.

Base 64 es capaz de descifrar-por lo que no tiene sentido el uso que simplemente fuera. Mi idea es que revolver el usuario y pasar antes y después de que se base64ed de esa manera, incluso después de descifrarlo, se obtiene un texto divertido mirar si intenta descifrar. ¿Hay una función php que acepta valores que harán una lucha única de una cadena y de-scramble más tarde cuando se reinputed el valor?

¿Alguna sugerencia?

¿Fue útil?

Solución

No debe cifrar las contraseñas, en lugar usted debe hash de ellos utilizando un algoritmo como bcrypt. Esta respuesta explica cómo implementar adecuadamente hash de la clave en PHP . Sin embargo, aquí es cómo se cifrar / descifrar :

$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces

Para cifrar:

$iv = mcrypt_create_iv(
    mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
    MCRYPT_DEV_URANDOM
);

$encrypted = base64_encode(
    $iv .
    mcrypt_encrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        $string,
        MCRYPT_MODE_CBC,
        $iv
    )
);

Para descifrar:

$data = base64_decode($encrypted);
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));

$decrypted = rtrim(
    mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
        MCRYPT_MODE_CBC,
        $iv
    ),
    "\0"
);

Advertencia : El ejemplo anterior cifra la información, pero no se autentica el texto cifrado para evitar la manipulación. Debe no depender de cifrado autenticado para la seguridad, sobre todo porque el código que proporciona es vulnerable a ataques de relleno de Oracle.

Vea también:

Además, no sólo tiene que utilizar una "contraseña" para una clave de cifrado. Las claves de cifrado son cadenas aleatorias.


demo en 3v4l.org :

echo 'Encrypted:' . "\n";
var_dump($encrypted); // "m1DSXVlAKJnLm7k3WrVd51omGL/05JJrPluBonO9W+9ohkNuw8rWdJW6NeLNc688="

echo "\n";

echo 'Decrypted:' . "\n";
var_dump($decrypted); // " string to be encrypted "

Otros consejos

  

Advertencia de seguridad : Esta clase no es segura. Se trata de utilizar Rijndael256-BCE, que no es semánticamente seguro. El hecho de que "funciona" no significa "que es seguro". Además, se despoja de asimetría espacios después debido a no utilizar el acolchado apropiado.

Se han encontrado esta clase recientemente, funciona como un sueño!

class Encryption {
    var $skey = "yourSecretKey"; // you can change it

    public  function safe_b64encode($string) {
        $data = base64_encode($string);
        $data = str_replace(array('+','/','='),array('-','_',''),$data);
        return $data;
    }

    public function safe_b64decode($string) {
        $data = str_replace(array('-','_'),array('+','/'),$string);
        $mod4 = strlen($data) % 4;
        if ($mod4) {
            $data .= substr('====', $mod4);
        }
        return base64_decode($data);
    }

    public  function encode($value){ 
        if(!$value){return false;}
        $text = $value;
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->skey, $text, MCRYPT_MODE_ECB, $iv);
        return trim($this->safe_b64encode($crypttext)); 
    }

    public function decode($value){
        if(!$value){return false;}
        $crypttext = $this->safe_b64decode($value); 
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->skey, $crypttext, MCRYPT_MODE_ECB, $iv);
        return trim($decrypttext);
    }
}

Y llamarlo:

$str = "My secret String";

$converter = new Encryption;
$encoded = $converter->encode($str );
$decoded = $converter->decode($encoded);    

echo "$encoded<p>$decoded";
  

Advertencia de seguridad:. Este código no es segura

ejemplo de trabajo

define('SALT', 'whateveryouwant'); 

function encrypt($text) 
{ 
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
} 

function decrypt($text) 
{ 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
} 

$encryptedmessage = encrypt("your message"); 
echo decrypt($encryptedmessage); 

Una cosa que debe ser muy consciente de cuando se trata de cifrado:

Tratando de ser inteligentes e inventando su propia cosa por lo general le dejará con algo inseguro.

probablemente estaría mejor fuera de uso de una de las extensiones de criptografía que vienen con PHP.

Esto sólo le dará una protección marginal. Si el atacante puede ejecutar código arbitrario en su aplicación que pueden conseguir en las contraseñas exactamente de la misma manera que su aplicación pueda. Aún puede conseguir una cierta protección contra algunos ataques de inyección SQL y copias de seguridad de base de datos fuera de lugar si almacena una clave secreta en un archivo y usarlo para cifrar en el camino hacia el PP y descifrar en la salida. Sin embargo, se debe utilizar bindparams de evitar por completo el tema de la inyección de SQL.

Si decide cifrar, debe utilizar alguna biblioteca de cifrado de alto nivel para esto, o se equivocan. Vas a tener que conseguir la llave a la instalación, relleno mensaje y comprobaciones de integridad correcta, o todo su esfuerzo cifrado es de poca utilidad. GPGME es una buena opción para un ejemplo. Mcrypt es de muy bajo nivel y es probable que se equivocan.

  

Securiy Advertencia : Este código es insegura . Además de ser vulnerable a ataques elegir-texto cifrado, su dependencia de unserialize() hace que sea vulnerable a la inyección de PHP objeto.

Para manejar una cadena / matriz utilizo estas dos funciones:

function encryptStringArray ($stringArray, $key = "Your secret salt thingie") {
 $s = strtr(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), serialize($stringArray), MCRYPT_MODE_CBC, md5(md5($key)))), '+/=', '-_,');
 return $s;
}

function decryptStringArray ($stringArray, $key = "Your secret salt thingie") {
 $s = unserialize(rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode(strtr($stringArray, '-_,', '+/=')), MCRYPT_MODE_CBC, md5(md5($key))), "\0"));
 return $s;
}

Es flexible como en la que puede almacenar / URL enviar a través de una cadena o una matriz porque la cadena / matriz se serialzed antes del cifrado.

Salida mycrypt (): http://us.php.net /manual/en/book.mcrypt.php

Y si usted está usando postgres hay pgcrypto para el cifrado de nivel de base de datos. (Hace que sea más fácil buscar y ordenar)

La mejor idea para cifrar / descifrar los datos en la base de datos, incluso si tiene acceso al código es utilizar 2 diferentes pasadas una contraseña privada (user-pass) para cada usuario y un código privado para todos los usuarios (system-pass).

Escenario

  1. user-pass se almacena con md5 en la base de datos y está siendo utilizado para validar cada usuario para iniciar sesión en el sistema. Este pase por el usuario es diferente para cada usuario.
  2. Cada entrada de usuario en la base de datos tiene en md5 un system-pass para el cifrado / descifrado de los datos. Esta-pass del sistema es la mismo para cada usuario.
  3. Cada vez que un usuario se elimina del sistema todos los datos que están cifrados bajo el viejo sistema de paso deben estar encriptados de nuevo bajo un nuevo sistema de paso para evitar problemas de seguridad.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top