2013-06-11 5 views
0

Il existe une fonction dans Mysql AES_encrypt.Chiffrement AES dans mysql et php

SELECT AES_encrypt("Hello World", "password") AS encrypted_value 

Cela donne le résultat: 9438eb79863e7009722fc3f0ad4b7198

Mais quand j'utilise le code en php pour faire AES_ENCRYPT il me donne une autre valeur.

Le code PHP je suis arrivé de stackoverflow - PHP AES encrypt/decrypt

<?php 
base64_encode(
     mcrypt_encrypt(
      MCRYPT_RIJNDAEL_256, 
      $sSecretKey, $sValue, 
      MCRYPT_MODE_ECB, 
      mcrypt_create_iv(
       mcrypt_get_iv_size(
        MCRYPT_RIJNDAEL_256, 
        MCRYPT_MODE_ECB 
       ), 
       MCRYPT_RAND) 
      ) 
     ), "\0" 
?> 

Le résultat à partir du code PHP est ytip2sEkD87gmRk3IVI09qE7T+RoLr20YK4rJp16NkY=

Y at-il une méthode en php ou CodeIgniter pour qu'il retourne la même valeur.? --Merci.

+1

Le premier est au format HEX et le second en base64? – HamZa

+1

Pour un, mysql utilise 128 bits, et vous utilisez 256 bits dans votre code php. [Référence] (https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_aes-encrypt) – 1615903

Répondre

4

Il y a trois problèmes avec le code que vous utilisez:

  1. Comme d'autres l'ont mentionné, votre PHP le code utilise actuellement MCRYPT_RIJNDAEL_256 alors, comme formalisées par AES_ENCRYPT():

    L'encodage avec une longueur de clé de 128 bits est utilisé, mais vous pouvez l'étendre jusqu'à 2 56 bits en modifiant la source. Nous avons choisi 128 bits car il est beaucoup plus rapide et suffisamment sécurisé pour la plupart des applications.

  2. Comme d'autres l'ont mentionné, vous postulez base64_encode() pour convertir résultat binaire de PHP au texte, alors que le résultat MySQL semble simplement être une représentation hexadécimale de son résultat binaire. Vous pouvez utiliser TO_BASE64() dans MySQL depuis la version 5.6.1 ou encore bin2hex() dans PHP.

  3. Comme documenté sous mcrypt_encrypt():

    Si la taille des données ne sont pas n * taille_de_bloc, les données seront complétées avec des '\ 0'.

    Alors que MySQL utilise PKCS7 padding.

Par conséquent, pour obtenir les mêmes résultats en PHP que vous présentez actuellement MySQL:

<?php 

class MySQL_Function { 
    const PKCS7 = 1; 

    private static function pad($string, $mode, $blocksize = 16) { 
    $len = $blocksize - (strlen($string) % $blocksize); 
    switch ($mode) { 
     case self::PKCS7: 
     $padding = str_repeat(chr($len), $len); break; 

     default: 
     throw new Exception(); 
    } 
    return $string.$padding; 
    } 

    public static function AES_ENCRYPT($str, $key_str) { 
    return mcrypt_encrypt(
     MCRYPT_RIJNDAEL_128, 
     $key_str, self::pad($str, self::PKCS7), 
     MCRYPT_MODE_ECB 
    ); 
    } 
} 

echo bin2hex(MySQL_Function::AES_encrypt("Hello World", "password")); 

?> 
0

Le MySQL utilise AES_ENCRYPT une longueur de clé de 128 bits - Référence here

Alors que votre code PHP utilise des longueurs de clé 256 bits.

Pour résoudre le problème, vous devriez être en mesure d'usages de la MCRYPT_RIJNDAEL_128 'au lieu de 256.

-1

Les œuvres de réponse acceptée mais est beaucoup de code, Voici une doublure

function aes_encrypt_str($val,$key){ 
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key, $val,MCRYPT_MODE_ECB,mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256,MCRYPT_MODE_ECB),MCRYPT_RAND)); 
} 
Questions connexes