- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我们的项目中,我们计划将数据以加密格式存储在 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/
我正在尝试使用 AES_DECRYPT 来解密表中的多个列,我该怎么做? 我正在尝试: SELECT column_a, column_b, column_c AES_DECRYPT(column_a
我一直在尝试许多不同的变体来让 AES_Decrypt 工作。我从字段类型 VARBINARY 开始,然后尝试了 BLOB 但仍然没有运气,不断返回 NULL。最终我尝试了这个: SELECT AES
我仍然不知道如何在 WHERE 子句中实现 AES_DECRYPT。 到目前为止我已经: SELECT id, AES_DECRYPT("name","salt"), AES_DECRYPT("add
这个问题已经有答案了: Unable to AES_DECRYPT after AES_ENCRYPT in mysql (4 个回答) 已关闭 7 年前。 我在 mysql 服务器 5.5.38 上
这里是 SQL 新手。我正在处理一个包含数据(longblob 类型)的表,它看起来像这样(导入到 phpMyAdmin 中): 这些文件(显然)使用 AES_Encrypt() 进行了 AES 加密
这个问题在这里已经有了答案: AES ECB encrypt/decrypt only decrypts the first 16 bytes (2 个回答) 4年前关闭。 我不知道为什么下面的代码会
我创建了一个加密表。无论大小写如何,我都试图在表中搜索特定字符串,但我无法让它工作 要搜索的字符串(员工) select aes_decrypt(category, 'salt') from test
我在 mysql 上有一个加密表,当我在命令窗口中运行以下查询时,我得到了预期的结果: select AES_DECRYPT(field,'key') as field from table 当我从
我有一些数据已加密存储在我的数据库之一上。这些是我希望在数据库上加密存储的个人详细信息。加密部分(AES_ENCRYPT(fname, $key) 工作正常 - 它以加密形式存储数据,正是我想要的方式
我有 MySQL 问题。 我想使用 AES_DECRYPT 解密 blob,并通过查询在 phpMyAdmin 中尝试 SELECT key_value ,AES_DECRYPT(key_value,
我正在使用 codeigniter。 运行以下查询后: $names = this->db->query("SELECT AES_DECRYPT(nombre,'".$key."') AS nombr
我有一个加密的 MySQL 数据库。当我执行 select where 时,它不会返回任何值。 SELECT cast(aes_decrypt(email, 'salt') as CHAR(100
我正在尝试从一些旧的遗留工作中的表中检索数据,电子邮件字段的字段中都有“[BLOB - 32 B]”,因此已加密 - 谁能解释一下我如何使用 AES_DECRYPT 来收集此表中的实际电子邮件地址?
在我的开发机器 WAMP 下,AES_ENCRYPT 和 AES_DECRYPT 没有按要求工作,我也用 ENCODE 和 DECODE 进行了测试,同样的事情发生了......我不明白为什么....
我正在介绍 MYSQL 中的加密功能。 只写了一个简单的SQL语句,将加密条目添加到字段中 INSERT INTO test_table (field1) VALUES(aes_encrypt('fi
我使用 AES_DECRYPT 将敏感数据存储在 mysql 表中。现在该表大约有 50 Mb。 我有一个 Web 界面(使用 PHP),访问者可以在其中搜索数据。我执行了一个 LIKE 搜索: SE
我发现了类似的问题,但这个问题没有明确的答案。我有这张 table : CREATE DATABASE testDB DEFAULT CHARACTER SET utf8 COLLATE utf8_g
我想更新没有 AES_ENCRYPT 的 JTable 数据可以更新和查看,但由于每次我尝试调用此方法时数据都会加密数据仍然是加密的。我该如何解决这个问题? private void Update_T
我的代码运行得很好。但后来我决定在将值存储到数据库之前对它们进行加密。我在将值存储在数据库中时使用 aes_encrypt 来加密值。我正在使用 aes_decrypt 来解密从数据库中检索/选择的值
我正在尝试替换消息并解密消息,我尝试了查询: select aes_decrypt(message,'Password')as message, replace(message,'#TD1
我是一名优秀的程序员,十分优秀!