mysql workbench aes 256解密

cotxawn7  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(543)

我有一个表:1)加密的id varchar(256)2)初始化向量(iv)varchar(256)。
我想用密钥解密列值
我正在使用:

select Cast(AES_DECRYPT(Encrypted_ID,'Key',InitializationVector_iv)as CHAR ) as DecryptedValue from MyTable;

结果为空。
我也试过:

select Cast(AES_DECRYPT(AES_ENCRYPT(Encrypted_ID,'Key',InitializationVector_iv),'Key') as CHAR ) as DecryptedValue from MyTable;

结果是几行的blob。
我不知道我做错了什么。有人能帮我解密这个列的语法吗
钥匙
初始化向量值
加密列

ztigrdn8

ztigrdn81#

在我的例子中,aes不适用于mysql工作台。我必须使用mysql控制台。

cvxl0en2

cvxl0en22#

mysql工作台为我工作。在我的例子中,加密值是以64为基数编码的。所以我必须使用“from\u base64”函数对base64值和iv进行解码。

SET block_encryption_mode = 'aes-256-cbc';
set @k = 'Key';
set @iv = From_base64('InitializationVector');
set @v = from_base64('EncryptedValue');
select CAST(AES_DECRYPT(@v, @k, @iv) AS CHAR);

在开始解密之前,请确保/iv值的加密类型、base64编码、hex/unhex正确。查看mysql函数https://dev.mysql.com/doc/refman/8.0/en/string-functions.html
希望这对某人有帮助。

r1wp621o

r1wp621o3#

实际上,您的第一个查询没有任何问题,从语法上讲,正如这个示例所示。

mysql> SET @@SESSION.block_encryption_mode = 'aes-256-cbc';

mysql> create table MyTable(
    ->  Encrypted_ID varbinary(256),
    ->  InitializationVector_iv varbinary(16)
    -> );
Query OK, 0 rows affected (0.93 sec)

mysql> SET @iv = RANDOM_BYTES(16);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO MyTable SET Encrypted_ID = AES_ENCRYPT('hello','key', @iv), InitializationVector_iv = @iv;
Query OK, 1 row affected (0.17 sec)

mysql> SELECT CAST(AES_DECRYPT(Encrypted_ID,'key', InitializationVector_iv) AS CHAR) from MyTable;
+------------------------------------------------------------------------+
| CAST(AES_DECRYPT(Encrypted_ID,'key', InitializationVector_iv) AS CHAR) |
+------------------------------------------------------------------------+
| hello                                                                  |
+------------------------------------------------------------------------+
1 row in set (0.00 sec)

至于为什么它不工作,我设法让查询在两种情况下返回null。第一,如果使用不同的iv进行加密和解密,则返回null,因此您可能需要查看如何将其存储为iv。第二,在存储和尝试检索值时,将block\u encryption\u mode变量设置为不同的值时,返回null,检查会话之间是否意外恢复到默认的“aes-128-ebc”。可能还有其他人。。。
第二个查询将失败,因为您需要同时向加密和解密函数提供iv,您只能使用它来加密。另外,由于您是从mytable获取值,因此加密的\u id已经被加密,此查询的效果是再次加密它,然后将其反转以返回存储的(加密的)值。
最后,aes将只使用16字节的iv,所以您不妨将其设为varbinary(16)。

相关问题