219 votes

Quelle est la meilleure façon d'utiliser PHP pour crypter et décrypter les mots de passe ?

Duplicata possible :
Cryptage bidirectionnel PHP : J'ai besoin de stocker des mots de passe qui peuvent être récupérés

J'ai l'intention de stocker sur mon site web des informations sur les comptes étrangers de mes utilisateurs, comme les noms d'utilisateur et les mots de passe de rapidshare, etc... Je veux garder les informations en sécurité, mais je sais que si je hachais leurs informations, je ne pourrais pas les récupérer pour un usage ultérieur.

Base64 est décryptable, il n'y a donc aucun intérêt à l'utiliser. Mon idée est de brouiller l'utilisateur et le mot de passe avant et après qu'il soit base64é, de cette façon, même après l'avoir décrypté, vous obtiendrez un texte étrange si vous essayez de le décrypter. Il existe une fonction php qui accepte des valeurs qui feront un brouillage unique d'une chaîne et le dé-brouilleront plus tard quand la valeur sera réinitialisée ?

Des suggestions ?

303voto

Alix Axel Points 63455

Vous ne devez pas crypter les mots de passe, mais les hacher à l'aide d'un algorithme tel que bcrypt. Cette réponse explique comment implémenter correctement le hachage de mot de passe en PHP. . Voici tout de même comment procéder au cryptage/décryptage :

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

Pour crypter :

$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
    )
);

Pour décrypter :

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

Avertissement : L'exemple ci-dessus chiffre les informations, mais n'authentifie pas le texte chiffré pour éviter toute falsification. Vous devez pas s'appuient sur le chiffrement non authentifié pour assurer leur sécurité d'autant plus que le code tel qu'il est fourni est vulnérable aux attaques de type "padding oracle".

Voir aussi

De même, ne vous contentez pas d'utiliser un "mot de passe" pour une clé de cryptage. Les clés de chiffrement sont des chaînes aléatoires.


Démonstration sur 3v4l.org :

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

echo "\n";

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

37voto

wilsonpage Points 5495

Avertissement de sécurité : Cette classe n'est pas sécurisée. Elle utilise Rijndael256-ECB ce qui n'est pas sémantiquement sûr. Ce n'est pas parce que "ça marche" que "c'est sûr". De plus, il supprime les espaces de queue par la suite parce qu'il n'utilise pas de rembourrage approprié.

J'ai découvert ce cours récemment et il fonctionne comme un rêve !

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

Et de l'appeler :

$str = "My secret String";

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

echo "$encoded<p>$decoded";

19voto

stasl Points 655

Avertissement de sécurité : Ce code n'est pas sécurisé.

exemple de travail

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

13voto

Il convient d'être très attentif à une chose lorsqu'il s'agit de cryptage :

Essayer d'être intelligent et d'inventer ses propres choses vous laissera généralement avec un sentiment d'insécurité.

Il est sans doute préférable d'utiliser l'un des outils suivants extensions de la cryptographie qui sont fournis avec PHP.

4voto

Martin Points 53

Avertissement de sécurité : Ce code est peu sûr . Outre le fait qu'il est vulnérable aux attaques par texte chiffré choisi, sa dépendance à l'égard des unserialize() le rend vulnérable à l'injection d'objets en PHP.

Pour traiter une chaîne de caractères / un tableau, j'utilise ces deux fonctions :

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

Il est flexible car vous pouvez stocker/envoyer via l'URL une chaîne ou un tableau car la chaîne/le tableau est sérialisé avant d'être crypté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X