php - mysql 和 php 中的 AES 加密

标签 php mysql codeigniter encryption

Mysql中有一个函数AES_encrypt

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

这给出了结果:9438eb79863e7009722fc3f0ad4b7198

但是当我使用 php 中的代码执行 AES_encrypt 时,它会给我一个不同的值。

我从 stackoverflow 得到的 PHP 代码 -- 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"
?>

PHP 代码的结果是 ytip2sEkD87gmRk3IVI09qE7T+RoLr20YK4rJp16NkY=

php 或 codeigniter 中是否有返回相同值的方法? --谢谢。

最佳答案

您使用的代码存在三个问题:

  1. 正如其他人所提到的,您的 PHP 代码当前使用的是 MCRYPT_RIJNDAEL_256,而如 AES_ENCRYPT() 中所述:

    Encoding with a 128-bit key length is used, but you can extend it up to 256 bits by modifying the source. We chose 128 bits because it is much faster and it is secure enough for most purposes.

  2. 正如其他人所提到的,您正在应用 base64_encode() 将 PHP 的二进制结果转换为文本,而 MySQL 结果似乎只是其二进制结果的十六进制表示。您可以使用 TO_BASE64()自 v5.6.1 起在 MySQL 中,否则 bin2hex()在 PHP 中。

  3. 根据 mcrypt_encrypt() 记录:

    If the size of the data is not n * blocksize, the data will be padded with '\0'.

    而 MySQL 使用 PKCS7 padding .

因此,要在 PHP 中获得与当前在 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" ));

?>

关于php - mysql 和 php 中的 AES 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17039628/

相关文章:

mysql - 如何连接到远程机器上的 docker mysql 容器

php - 具有一些特殊要求的多行排序

java - Java 中的动态绑定(bind)

php - 标题后延迟取消链接

javascript - Symfony2 + AJAX返回源码

MySQL:选择所有不同的记录,选择具有最新时间戳的记录进行重复?

php - mysqli准备语句错误 "MySQL server has gone away"

javascript - Codeigniter - 首先确认 anchor

php - CodeIgniter将var val匹配到mysql db

php - Html 外文字符编码