gpt4 book ai didi

php - MySql AES_DECRYPT 和 AES_ENCRYPT key 在 PHP 中不起作用

转载 作者:行者123 更新时间:2023-12-02 16:12:04 26 4
gpt4 key购买 nike

在我们的项目中,我们计划将数据以加密格式存储在 mysql 数据库中,我们在我们的项目中使用了 php 和 MqSql。Mqsql 加密工作正常,我对 MqSql 使用了以下方法

 INSERT INTO emails  SET email= TO_BASE64(AES_ENCRYPT('selvamani.p','3xY4/xrbFETctQS0Rkd1r6MKS4PUXetmjTeuRHkMt2w=', '44Y9/xrbFETcmQS0'));

SELECT id, AES_DECRYPT(FROM_BASE64(email), '3xY4/xrbFETctQS0Rkd1r6MKS4PUXetmjTeuRHkMt2w=','44Y9/xrbFETcmQS0') AS decrypt_string from emails e

但我们无法解密 PHP 中由 MqSql 加密的字符串。在php中我们是这样使用的

 $stringValue = openssl_encrypt($stringValue, $this->cipher_method,$this->encryption_key, $this->options, $this->encryption_iv);    

$stringValue = openssl_decrypt(base64_decode($stringValue), $this->cipher_method, $this->encryption_key, $this->options, $this->encryption_iv);

最佳答案

当使用 AES 使用一个库进行加密,然后使用另一个库进行解密时,请务必确保双方的所有细微差别都相同。例如。

  • AES 有多种模式(例如 aes-128-cbc、aes_128-ecb、aes-128-gcm、aes-256-cbc、aes_256-ecb、aes-256-gcm 等等)。加密和解密使用相同的模式很重要。

  • 许多 AES 加密/解密函数允许您传入密码而不是 key ,并且该函数在内部从密码派生出 key 。然而,当从一个库转到另一个库时,这通常会充满问题,因为内部用于 key 派生的方法在不同的实现之间差异很大。因此,最好直接传递 key (长度正确,适用于您正在使用的 AES 模式),而不是传递密码。

  • 加密和解密函数通常希望将明文、密文、 key 、iv 等输入作为原始字节而非文本传入。请注意这一点,并确保在需要时传入原始字节。同样,加密和解密函数通常以原始字节形式产生输出。请务必相应地处理这些问题。

MySQL 默认使用 aes_128_ecb 模式(参见 https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html )。因此,要在 MySQL 中使用 aes_128_ecb 模式使用 key F3229A0B371ED2D9441B830D21A390C3 加密明文 'bill.smith@gmail.com',我们可以这样做:

 select to_base64(aes_encrypt('bill.smith@gmail.com', UNHEX('F3229A0B371ED2D9441B830D21A390C3')));

请注意, key 以十六进制编码的字符串形式提供,其长度与正在使用的模式(128 字节)相符,我们使用 UNHEX() 将其转换为 MySQL aes_encrypt 所需的原始字节() 功能。 aes_encrypt() 函数生成原始字节作为其输出,我们使用 to_base64() 对这些原始字节进行 base64 编码以生成可显示的文本。上述语句产生以下 base64 编码的密文:

oPN1EIfxX+MFMfcp2jTjjB55QVUURKV8lbfcwhT3MMk=

让我们看看是否可以使用相同的 key 解密它,在命令行上使用 openssl,看看是否会生成我们开始时使用的明文:

echo -n 'oPN1EIfxX+MFMfcp2jTjjB55QVUURKV8lbfcwhT3MMk=' | base64 -d | openssl aes-128-ecb -d -K F3229A0B371ED2D9441B830D21A390C3

同样,请注意确保所有输入都正确传递。上面的命令产生:

bill.smith@gmail.com

太棒了。我们能够在 MySQL 中加密一些明文,然后在 openssl 中执行相反的操作,并且成功了。现在,让我们看看我们是否可以在 PHP 中解密密文。让我们试试这个:

$ciphertextbase64="oPN1EIfxX+MFMfcp2jTjjB55QVUURKV8lbfcwhT3MMk=";
$keyhex='F3229A0B371ED2D9441B830D21A390C3';
$ciphertextbytes=base64_decode($ciphertextbase64);
$keybytes=hex2bin($keyhex);
$plaintext = openssl_decrypt($ciphertextbytes, 'aes-128-ecb', $keybytes);
print $plaintext;

再次注意正确传递所有内容的注意事项。但是,在我的系统上,上面的代码片段没有产生任何输出。有什么问题吗?

正在运行 openssl_get_cipher_methods ,在我的系统上,我发现不支持 aes-128-ecb。这并不奇怪,因为 aes-128-ecb 有 known weaknesses .要解决这个问题,最好在 MySQL 端使用其他模式进行加密(有关更多信息,请参阅 https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html)。

关于php - MySql AES_DECRYPT 和 AES_ENCRYPT key 在 PHP 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67732941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com