Mysql
 sql >> Base de données >  >> RDS >> Mysql

Cryptage AES dans mysql et php

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

  1. Comme d'autres l'ont mentionné, votre code PHP utilise actuellement MCRYPT_RIJNDAEL_256 considérant que, comme documenté sous AES_ENCRYPT() :

  2. Comme d'autres l'ont mentionné, vous appliquez base64_encode() pour convertir le résultat binaire de PHP en texte, alors que le résultat MySQL apparaît simplement comme une représentation hexadécimale de son résultat binaire. Vous pouvez soit utiliser TO_BASE64() dans MySQL depuis v5.6.1 ou bien bin2hex() en PHP.

  3. Comme documenté sous mcrypt_encrypt() :

    Alors que MySQL utilise le le rembourrage PKCS7 .

Par conséquent, pour obtenir les mêmes résultats en PHP que ceux que vous affichez actuellement pour 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" ));

?>