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 中是否有返回相同值的方法? --谢谢。
最佳答案
您使用的代码存在三个问题:
正如其他人所提到的,您的 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.
正如其他人所提到的,您正在应用
base64_encode()
将 PHP 的二进制结果转换为文本,而 MySQL 结果似乎只是其二进制结果的十六进制表示。您可以使用TO_BASE64()
自 v5.6.1 起在 MySQL 中,否则bin2hex()
在 PHP 中。根据
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/