Cod*_*mer 0 php mysql encryption codeigniter
Mysql AES_encrypt中有一个函数.
SELECT AES_encrypt( "Hello World", "password" ) AS encrypted_value
Run Code Online (Sandbox Code Playgroud)
这给出了结果: 9438eb79863e7009722fc3f0ad4b7198
但是当我使用php中的代码来执行AES_encrypt时,它给了我不同的值.
我从stackoverflow获得的PHP代码 - PHP AES加密/解密
<?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"
?>
Run Code Online (Sandbox Code Playgroud)
PHP代码的结果是 ytip2sEkD87gmRk3IVI09qE7T+RoLr20YK4rJp16NkY=
在php或codeigniter中是否有一个方法,以便它返回相同的值. - 谢谢.
您使用的代码有三个问题:
正如其他人所提到的,您的PHP代码目前正在使用,MCRYPT_RIJNDAEL_256而如下所述AES_ENCRYPT():
使用128位密钥长度的编码,但您可以通过修改源将其扩展到256位.我们选择了128位,因为它更快,并且对于大多数用途来说足够安全.
正如其他人所提到的,您正在申请base64_encode()将PHP的二进制结果转换为文本,而MySQL结果似乎只是其二进制结果的十六进制表示.您可以TO_BASE64()在v5.6.1中使用MySQL,也可以bin2hex()在PHP中使用.
由于根据记载mcrypt_encrypt():
如果数据的大小不是n*blocksize,则数据将用' \ 0 ' 填充.
MySQL使用PKCS7填充.
因此,要在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" ));
?>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6669 次 |
| 最近记录: |