MySql WorkBench AES 256解密

时间:2018-08-13 22:09:25

标签: mysql encryption aes

我的桌子有: 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;

结果是几行的斑点。

我不确定我在做什么错。有以下情况时,有人可以帮忙解密该列的语法吗?

  1. 初始化向量值
  2. 加密列

3 个答案:

答案 0 :(得分: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)

至于为什么它不起作用,我设法在两种情况下使查询返回NULL。第一,如果您使用不同的iv进行加密和解密,则将返回NULL,因此您可能需要查看如何将其存储为iv。第二,在存储和尝试检索该值时,如果将block_encryption_mode变量设置为不同,则会得到NULL,请确保您没有在会话之间意外恢复为默认的'aes-128-ebc。可能还有其他人...

第二个查询将失败,因为您需要同时向加密和解密函数提供iv,而仅使用它进行加密。另外,由于您正在从MyTable中获取值,因此Encrypted_ID已被加密,并且此查询的作用是再次对其进行加密,然后再将其反转以使您返回到存储(加密)的值。

最后,AES仅会使用iv的16 bytes,因此您最好将其设为VARBINARY(16)。

答案 1 :(得分:0)

在我的情况下,

AES无法与MySQL Workbench一起使用。 我必须使用mysql控制台。

答案 2 :(得分:0)

MySql Workbench为我工作。 在我的案例中,加密值以base 64编码。 因此,我不得不使用“ From_base64”函数解码base 64值和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);

在开始解密之前,请确保加密类型,基数64编码,值/ Iv的十六进制/反十六进制正确。 查看MYSql函数 https://dev.mysql.com/doc/refman/8.0/en/string-functions.html

希望这对某人有帮助。