【问题标题】:Why is AES_DECRYPT returning null?为什么 AES_DECRYPT 返回 null?
【发布时间】:2013-04-25 20:54:26
【问题描述】:

我发现了类似的问题,但这个问题没有明确的答案。我有这张桌子:

CREATE DATABASE testDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 

CREATE TABLE testTable
(
firstName binary(32) not null,
lastName binary(32) not null
/* Other non-binary fields omitted */
)
engine=INNODB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

这条语句执行得很好:

INSERT INTO testTable (firstName) VALUES (AES_ENCRYPT('Testname', 'test'));

但是,这会返回 NULL:

SELECT AES_DECRYPT(firstName, 'test') FROM testTable;

为什么返回 NULL?

Fwiw,这会按预期返回“testValue”:

SELECT AES_DECRYPT(AES_ENCRYPT('testValue','thekey'), 'thekey');

【问题讨论】:

  • @owlstead 我做到了。它在 INSERT 和 SELECT 语句中。我选择的字段是firstName,来自表testTable
  • 哦,那是你,我的错,谢谢你的反馈:) 你可以在一段时间后接受你自己的答案

标签: mysql aes


【解决方案1】:

答案是列是binary,而它们应该是varbinaryThis article 解释它:

因为如果 AES_DECRYPT() 检测到无效数据或 不正确 填充,它将返回NULL。

binary 列类型为固定长度,因此必须知道输入值的长度以确保正确填充。对于未知长度值,请使用varbinary 以避免因值长度不同而导致填充不正确的问题。

【讨论】:

  • 嘿,我只是在试验 AES 函数,我已将我的 email_id 字段设置为 varbinary(30)。对于长度>16 的电子邮件,AES_ENCRYPT 输出的长度可能为 30 + 填充。当我在我的记录上使用 AES_DECRYPT 时,在我将 email_id 的大小更改为 varbinary(50) 之后,该特定记录显示为空 所以它在 AES_DECRYPT 上变为 NULL 因为你在说什么或者因为我改变了大小email_id 到 50 个?
【解决方案2】:

当您将二进制数据插入 VARCHAR 字段时,会出现一些 VARCHAR 无法处理的二进制字符,它们会在插入的值中弄乱。然后在检索时插入的值将不一样。 1.select hex(aes_encrypt(file,'key')); 2.select aes_decrypt(unhex(file),'key');

【讨论】:

    【解决方案3】:

    检查您的字段类型是否为 blob 而不是二进制 (32)

    【讨论】:

      【解决方案4】:

      您是否尝试过除“Testname”之外的其他值? 其他值是否有效?

      我问是因为我在测试 2 个测试信用卡号时遇到一种情况,其中一个解密正常,另一个返回 null。

      答案是“abhinai raj”建议的十六进制和非十六进制

      【讨论】:

      • 你似乎没有在这里提供新的答案
      猜你喜欢
      • 1970-01-01
      • 2022-12-26
      • 2016-12-28
      • 2015-11-25
      • 2015-07-04
      • 2019-09-29
      • 2015-02-25
      • 2015-10-21
      • 2021-08-12
      相关资源
      最近更新 更多