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


3 Answers

Avertissement de sécurité : Cette classe n'est pas sécurisée. Il utilise Rijndael256-ECB , qui n'est pas sémantiquement sécurisé. Juste parce que "ça marche" ne veut pas dire "c'est sécurisé". En outre, il dépouille les espaces de résidus après l'utilisation du rembourrage approprié.

Trouvé cette classe récemment, cela 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 pour l'appeler:

$str = "My secret String";

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

echo "$encoded<p>$decoded";
Question

Dupliquer possible:
Cryptage bidirectionnel PHP: j'ai besoin de stocker les mots de passe qui peuvent être récupérés

Je prévois de stocker des informations de compte étrangères pour mes utilisateurs sur mon site web, nom d'utilisateur et mots de passe rapidshare, etc ... Je veux garder l'information sécurisée, mais je sais que si je hais leurs informations, je ne peux pas les récupérer pour usage ultérieur .

Base64 est déchiffrable, donc il n'y a aucun intérêt à l'utiliser tout simplement. Mon idée est de brouiller l'utilisateur et de passer avant et après que ça se base64 de cette façon même après que vous l'ayez décrypté, vous obtenez un texte drôle si vous essayez de décrypter. Y a-t-il une fonction php qui accepte des valeurs qui feront une brouille unique d'une chaîne et la désembrouilleront plus tard quand la valeur est réinvestie?

Aucune suggestion?




La meilleure idée pour crypter / décrypter vos données dans la base de données même si vous avez accès au code est d'utiliser 2 passes différentes un mot de passe privé ( user-pass ) pour chaque utilisateur et un code privé pour tous les utilisateurs ( system-pass ).

Scénario

  1. user-pass est stocké avec md5 dans la base de données et est utilisé pour valider chaque utilisateur pour se connecter au système. Ce passe utilisateur est différent pour chaque utilisateur.
  2. Chaque entrée d'utilisateur dans la base de données a dans md5 un system-pass pour le cryptage / décryptage des données. Cette passe système est la même pour chaque utilisateur.
  3. Chaque fois qu'un utilisateur est retiré du système, toutes les données chiffrées sous l'ancienne passe système doivent être cryptées à nouveau sous un nouveau passage système pour éviter les problèmes de sécurité.



Securiy Attention : Ce code n'est pas sécurisé . En plus d'être vulnérable aux attaques de type texte chiffré, son utilisation de unserialize() rend vulnérable à l'injection d'objets PHP.

Pour gérer une chaîne / 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;
}

C'est flexible car vous pouvez stocker / envoyer via URL une chaîne ou un tableau car la chaîne / tableau est sérialisé avant le cryptage.




Une chose dont vous devriez être très conscient en traitant du cryptage:

Essayer d'être intelligent et d'inventer votre propre chose vous laissera généralement avec quelque chose d'insécure.

Vous feriez probablement mieux d'utiliser l'une des extensions de cryptographie fournies avec PHP.




Related