2010-09-23 25 views
0

J'ai implémenté AES sur mon site web pour des raisons de sécurité et j'ai rencontré un problème que je n'arrive pas à trouver une réponse et je trouve cela plutôt bizarre.PHP + AES Security Glitch

JE CROIS Je sais où il réside mais je ne sais pas comment/où faire le correctif. Actuellement, j'ai PHP 5 et la dernière version de MySQL sur mon serveur local.

Voici un petit test que je cours qui semble fonctionner très bien.

<?php 

$fName = "Giesbrecht"; 

$fNameEncrypt = common::encryptMe($fName); 
echo $fNameEncrypt ."<br />"; 
echo common::decryptMe($fNameEncrypt); 

?> 

Ma fonction pour l'utilisation en fait la commune: EncryptMe()

public static function encryptMe ($value) 
// USE THE AES ENCRYPTION TO ENCRYPT ANY VALUE 
{ 
    include_once('../resources/crypt/AES.php'); 

    $aes = new Crypt_AES(); 
    $aes->setKey(AES_KEY); 
    return $aes->encrypt($value); 
} 

Le problème semble fonctionner quand j'insérer mes valeurs dans mon serveur MySQL. Donc, je pensais que cela aurait pu être mon jeu de caractères, mis à Latin1, et maintenant je suis passé à UTF8 - Unicode UTF-8

D'autres facteurs concernant ma configuration MySQL: J'ai essayé à utiliser le terrain types tels que: varchar, varbinary (où je suis actuellement assis), et le texte d'une longueur de (256 sur tous). J'ai beaucoup de champs de colonne dans ma table, et beaucoup d'entre eux devront être cryptés, bien que je ne fais que tester avec 2 jusqu'à ce que j'ai tout compris. Donc le problème que j'ai rencontré est quand je l'insère dans la base de données et je regarde la valeur dans ma base de données J'ai la valeur des caractères, ils égalent ¥ ÄθLOI "~: é0 (bien que je ' m que le trans-codage ici va modifier) ​​Je l'ai inséré une capture d'écran de la valeur réelle dans la base de données ici: alt text

Mais lorsque je tente de déchiffrer la valeur, je reçois rien, et il fonctionne vide. Il semble qu'il y ait un problème avec tout mot commençant par un CAPITAL "G". Si j'ai un minuscule "g", ça semble fonctionner ...

Je suis complètement perplexe et je n'ai aucune idée de comment résoudre ce problème.

Toute aide serait grandement appréciée. PS. Je suis également curieux de savoir si l'utilisation de PHP AES_Encryption est meilleure ou si MySQL AES_ENCRYPT est meilleur?

Merci.

J'ai maintenant ajouté une nouvelle section de code de travail basé sur des réponses using base64 ... S'il vous plaît informez-moi si quelque chose ne va pas avec cette structure.

<?php 

$connect = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); 
mysql_select_db(DB_NAME, $connect); 

$fName = "Giesbrecht"; 

$encode = common::cleanUp($fName); 
$encode = common::encryptMe($encode); 
$encode = base64_encode($encode); 

mysql_query("INSERT INTO contacts (userId, firstName, lastName) VALUES ('15', 'Justin', '".$encode."')") or die(mysql_error()); 

$results = mysql_query("SELECT * FROM contacts WHERE userId = '15'") 
or die(mysql_error()); 

while ($row = mysql_fetch_array($results)) 
{ 
    echo "<br />FN: ". $row['firstName']; 
    echo "<br />LNE: ". $row['lastName']; 
    echo "<br />LN: ". common::decryptMe(base64_decode($row['lastName'])); 
} 

?> 
+0

Vous pensez que le problème réside dans le stockage et la récupération des données dans/depuis la base de données. Pourtant, vous ne nous dites rien sur la base de données (sauf que vous utilisez MySQL). – VolkerK

+0

Désolé VolkerK, j'ai inclus plus d'informations sur mySQL s'il y a quelque chose de spécifique que je serais heureux de fournir. – Justin

Répondre

1

Pour autant que je sache, il n'y a pas de fonction de cryptage AES au sein de PHP (il y a des implémentations 3ème partie, et mcrypt a un/habituellement expédié avec PHP).

La plupart des implémentations renvoient une valeur binaire pour la chaîne chiffrée (essayez le codage/décodage base64 avant l'insertion/la récupération). Quand j'ai regardé cela pour la dernière fois (admise il y a quelques temps), mcrypt a retourné une chaîne PHP qui contenait la valeur chiffrée réelle en tant que chaîne C (terminée par un caractère nul). c'est-à-dire qu'il contenait souvent des caractères supplémentaires après la fin de la valeur.

HTH

C.

+0

Salut Symcbean, j'ai ajouté un peu plus de code que vous avez commenté en utilisant base64 ... comment cela vous regarde-t-il? – Justin