sql >> Database teknologi >  >> RDS >> Mysql

AES-kryptering i mysql og php

Der er tre problemer med den kode, du bruger:

  1. Som andre har nævnt, bruger din PHP-kode i øjeblikket MCRYPT_RIJNDAEL_256 hvorimod, som dokumenteret under AES_ENCRYPT() :

  2. Som andre har nævnt, anvender du base64_encode() at konvertere PHP's binære resultat til tekst, hvorimod MySQL-resultatet kun ser ud til at være en hexadecimal repræsentation af dets binære resultat. Du kan enten bruge TO_BASE64() i MySQL siden v5.6.1 eller andet bin2hex() i PHP.

  3. Som dokumenteret under mcrypt_encrypt() :

    Hvorimod MySQL bruger PKCS7-polstring .

Derfor, for at opnå de samme resultater i PHP, som du i øjeblikket viser for 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" ));

?>


  1. Brug af MySQL IN-klausul som alt inklusive (AND i stedet for OR)

  2. MySQL LAST_INSERT_ID() brugt med flere poster INSERT-sætning

  3. Introduktion til ER-datamodellen

  4. Forskellen mellem sys.sql_modules, sys.system_sql_modules og sys.all_sql_modules i SQL Server