Meilleure façon D'utiliser PHP pour chiffrer et déchiffrer les mots de passe? [dupliquer]

possibilité de dupliquer:

PHP 2-way encryption: je dois stocker des mots de passe qui peuvent être récupérés

j'ai l'intention de stocker des informations de Compte étranger pour mes utilisateurs sur mon site web, alias rapidshare username and passwords, etc... Je veux garder les informations en sécurité, mais je sais que si je hash leurs informations, je ne peux pas les récupérer pour une utilisation ultérieure.

Base64 est déchiffrable donc ça ne sert à rien d'utiliser ça. Mon idée est de brouiller l'utilisateur et passer avant et après qu'il soit base64ed de cette façon, même après que vous le décryptez, vous obtenez un texte à la recherche drôle si vous essayez de décrypter. Y a-t-il une fonction php qui accepte des valeurs qui feront un brouillage unique d'une chaîne de caractères et le désamorceront plus tard lorsque la valeur sera réinputée?

des suggestions?

208
demandé sur Community 2009-08-17 20:39:02

8 réponses

vous ne devez pas crypter les mots de passe, à la place vous devez les hachez en utilisant un algorithme comme bcrypt. cette réponse explique comment implémenter correctement le hachage de mot de passe en PHP . encore, voici comment vous crypter/déchiffrer:

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

Pour Chiffrer:

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

À Déchiffrer:

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

Warning : l'exemple ci-dessus crypte l'information, mais il n'authentifie pas le cryptogramme pour empêcher la falsification. Vous devriez pas s'appuient sur non authentifié de chiffrement pour la sécurité , surtout depuis que le code fourni est vulnérable à l'padding oracle attaques.

voir aussi:

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


démonstration à 3v4l.org :

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

echo "\n";

echo 'Decrypted:' . "\n";
var_dump($decrypted); // " string to be encrypted "
292
répondu Alix Axel 2017-05-23 12:34:59

Avertissement de Sécurité : Cette classe n'est pas sécurisé. Il utilise Rijndael256-ECB , ce qui n'est pas sûr du point de vue sémantique. Juste parce que "ça marche" ne signifie pas "c'est sûr". En outre, il bande les espaces de queue par la suite en raison de ne pas utiliser le rembourrage approprié.

Trouvé cette classe récemment, 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";
34
répondu wilsonpage 2016-02-15 08:21:15

avertissement de sécurité: ce code n'est pas sécurisé.

exemple pratique

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); 
18
répondu stasl 2016-02-15 08:15:43

une chose que vous devriez être très conscient de lorsqu'il est question de cryptage:

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

vous seriez probablement mieux en utilisant l'une des extensions de cryptographie qui viennent avec PHP.

12
répondu Sebastian Paaske Tørholm 2009-08-17 16:50:07

avertissement de sécurité : ce code est non sécurisé . En plus d'être vulnérable aux attaques de type chosen-ciphertext, sa dépendance sur unserialize() le rend vulnérable à L'Injection D'objet PHP.

pour manipuler une chaîne de caractères / 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))), ""151900920""));
 return $s;
}

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

3
répondu Martin 2016-02-15 08:16:56

cela ne vous donnera qu'une protection marginale. Si l'attaquant peut exécuter du code arbitraire dans votre application, ils peuvent obtenir les mots de passe exactement de la même manière que votre application peut. Vous pouvez toujours obtenir une certaine protection contre certaines attaques par injection SQL et des sauvegardes de db égarées si vous stockez une clé secrète dans un fichier et utilisez cela pour chiffrer sur le chemin de la db et déchiffrer sur le chemin de sortie. Mais vous devez utiliser bindparams pour éviter complètement le problème de L'injection SQL.

Si vous décidez de chiffrer, vous devez utiliser certaines de haut niveau crypto library, sera se tromper. Vous aurez à obtenir la clé-configuration, le remplissage de message et les contrôles d'intégrité corrects, ou tous vos efforts de cryptage est de peu d'utilité. GPGME est un bon choix pour un exemple. Mcrypt est trop bas niveau, et vous obtiendrez probablement tort.

2
répondu Ants Aasma 2009-08-17 16:53:45

découvrez mycrypt(): http://us.php.net/manual/en/book.mcrypt.php

et si vous utilisez postgres il y a pgcrypto pour le cryptage au niveau de la base de données. (facilite la recherche et le tri)

1
répondu Josh Rice 2009-08-17 16:50:59

la meilleure idée pour chiffrer/déchiffrer 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. Cet utilisateur-pass est différent pour chaque utilisateur.
  2. chaque entrée utilisateur dans la base de données a en md5 un system-pass pour le cryptage/déchiffrement des données. Ce passe-système est le même pour chaque utilisateur.
  3. chaque fois qu'un utilisateur est retiré du système toutes les données qui sont cryptées sous l'ancien system-pass doivent être cryptées à nouveau sous un nouveau system-pass pour éviter les problèmes de sécurité.
0
répondu Nikos Tsirakis 2012-11-18 15:19:24