2013-04-25 3 views
5

Я нашел похожие вопросы, но нет четкого ответа на этот вопрос. У меня есть эта таблица:Почему AES_DECRYPT возвращает null?

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'); 
+0

@owlstead Я сделал. Он находится в операциях INSERT и SELECT. Поле, которое я выбираю, является 'firstName' из таблицы' testTable'. – user1091949

+0

О, это вы, моя ошибка, спасибо за сообщение об этом назад :) Вы можете принять свой собственный ответ после whilte –

ответ

9

Ответ заключается в том, что столбцы binary, когда они должны быть varbinary. This article объясняет:

Потому что если AES_DECRYPT() обнаруживает неверные данные или неправильный отступов, он возвращает NULL.

С binary Типы столбцов фиксированной длины, длина входного значения должна быть известна, чтобы обеспечить правильное заполнение. Для значений неизвестной длины используйте varbinary, чтобы избежать проблем с неправильным заполнением из-за различной длины значений.

+0

Эй, я просто экспериментировал с функциями AES, и я установил поле 'email_id' в' varbinary (30) '. И для электронной почты длиной> 16 выход 'AES_ENCRYPT', вероятно, имел длину 30 + дополнение. И когда я использовал AES_DECRYPT в своих записях, эта конкретная запись показывала нуль, после того как я изменил размер 'mail_id' на' varbinary (50) ' Так получилось ли оно NULL на AES_DECRYPT из-за того, что вы говорите, или потому что я изменил размер 'email_id' до 50? –

-1

Когда вы вставляете двоичные данные в поле VARCHAR, существуют двоичные символы, которые VARCHAR не может обрабатывать, и они будут беспорядочно вставлены в вставленное значение. И тогда вставленное значение не будет таким же, когда вы его получите. 1.select hex (aes_encrypt (файл, 'ключ')); 2.select aes_decrypt (unhex (файл), 'ключ');

0

Проверьте, не является ли тип вашего поля блобом вместо двоичного (32)

Смежные вопросы