MySql WorkBench AES 256解密

问题描述 投票:0回答:3

我有表:1)Encrypted_ID varchar(256)2)初始化向量(iv)varchar(256)。

我想使用密钥解密列值

我在用:

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

结果是Null。

我也尝试过:

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

结果是blob几行。

我不确定我在这里做错了什么。当我有以下时,任何人都可以帮助解释列的语法:

  1. 初始化矢量值
  2. 加密列
mysql encryption aes
3个回答
1
投票

你的第一个查询实际上并没有什么问题,从语法上来看,这个实例证明了这一点。

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)

至于为什么它不工作,我设法让查询在2个场景中返回NULL。一,如果你使用不同的iv加密和解密,你会得到NULL,所以你可能想看看你如何存储为iv。第二,你得到NULL,你在存储和尝试检索值时设置了不同的block_encryption_mode变量,检查你是否意外地恢复到会话之间的默认'aes-128-ebc。可能还有其他人......

第二个查询将失败,因为您需要为加密和解密函数提供iv,您只能使用它进行加密。此外,由于您从MyTable获取值,因此Encrypted_ID将已加密,此查询的效果将是再次加密,然后再将其加密以使您返回到存储的(加密)值。

最后,AES只会使用iv的16 bytes,所以你也可以使用VARBINARY(16)。


0
投票

在我的情况下,AES不能与MySQL Workbench一起使用。我必须使用mysql控制台。


0
投票

MySql Workbench为我工作。在我的案例中,加密值是在base 64中编码的。所以我不得不解码base 64值和IV使用“From_base64”函数。

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的加密类型,base 64编码,Hex / Unhex正确无误。查看MYSql函数https://dev.mysql.com/doc/refman/8.0/en/string-functions.html

希望这对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.