如何解决解密字符串使用mysql aes_encryption函数进行加密
对于项目要求,我需要将加密格式的值存储在mysql中。 PHP和Mysql都应可以进行解密和加密。 我尝试使用openssl加密解密。在低于5.7版本的mysql中,我们无法设置加密模式。默认模式是aes-128-ecb。当我尝试在openssl中使用相同模式解密时,我得到了空值。
查询:从tbl_name中选择AES_ENCRYPT('ABCD','69f0ff56314d4e2d02bc89f6f4b5292c');
结果:0x907fb5ce60223d205e7c0f0bc338d563
当我将此结果传递给PHP时:
<?php
$plaintext = "0x907fb5ce60223d205e7c0f0bc338d563";
$cipher = "aes-128-ecb";
$key = "69f0ff56314d4e2d02bc89f6f4b5292c";
if(in_array($cipher,openssl_get_cipher_methods())) {
$ciphertext = openssl_decrypt($plaintext,$cipher,$key);
echo $ciphertext;
}
它不起作用。知道我缺少什么或以其他任何方式实现这一目标吗? MySQL版本:5.0 PHP的:7
解决方法
PHP代码中存在一些问题,但最重要的是通过MySQL文档中未命名的函数从给定密钥“派生”解密密钥。
我从此站点获得了信息和功能,并且所有功劳归功于他们:https://www.smashingmagazine.com/2012/05/replicating-mysql-aes-encryption-methods-with-php/。
其他问题是:a)密文是二进制表示形式的十六进制编码字符串,以及b)openssl_decrypt函数末尾的“ true”参数[将数据作为二进制而不是Base64编码]。
安全警告:此代码使用的是UNSECURE AES模式“ EBC”,一个静态密钥,没有任何异常处理。该代码仅用于教育目的。
这是简单而预期的输出-您可以通过我的在线编译器(https://repl.it/@javacrypto/PhpAesDecryptFromMysql)运行代码:
ABCD
完整运行的源代码:
<?php
function mysql_aes_key($key)
// source: https://www.smashingmagazine.com/2012/05/replicating-mysql-aes-encryption-methods-with-php/
{
$new_key = str_repeat(chr(0),16);
for ($i = 0,$len = strlen($key); $i < $len; $i++) {
$new_key[$i % 16] = $new_key[$i % 16] ^ $key[$i];
}
return $new_key;
}
$ciphertextFromMysql = "907fb5ce60223d205e7c0f0bc338d563";
$key = "69f0ff56314d4e2d02bc89f6f4b5292c";
$ciphertext = hex2bin($ciphertextFromMysql);
$cipher = "aes-128-ecb";
if (in_array($cipher,openssl_get_cipher_methods())) {
//$ciphertext = openssl_decrypt($ciphertext,$cipher,$key,true);
$decrypttext = openssl_decrypt($ciphertext,mysql_aes_key($key),true);
echo $decrypttext;
}
?>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。