2013-04-25 164 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,這將返回預期 「測試值」:

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

@owlstead我做到了。它在INSERT和SELECT語句中。我選擇的字段是'testTable'表中的'firstName'。 – user1091949 2013-04-25 21:34:22

+0

噢,那是你,我的錯誤,感謝你報告回來:)你可以接受你自己的答案後whilte – 2013-04-28 10:51:41

回答

9

的答案是,列binary時,他們應該是varbinaryThis article解釋它:

因爲如果AES_DECRYPT()檢測到無效數據或不正確填充 ,它將返回NULL。

對於binary列類型爲固定長度,必須知道輸入值的長度以確保正確的填充。對於未知長度值,請使用varbinary來避免由於值長度不同而導致填充不正確的問題。

+0

嘿,我只是試驗AES函數,我已經設置我的'email_id'字段varbinary( 30)'。對於長度大於16的電子郵件,AES_ENCRYPT輸出的長度可能爲30+。當我在我的記錄上使用AES_DECRYPT時,在將'email_id'的大小更改爲'varbinary(50)' 之後,該特定記錄顯示爲空,因此它在AES_DECRYPT上因爲您所說的內容而變爲NULL因爲我將'email_id'的大小更改爲50? – 2013-08-22 08:56:01

-1

將二進制數據插入到VARCHAR字段中時,會有一些VARCHAR無法處理的二進制字符,它們會混入插入的值中。然後,當您檢索它時插入的值不會相同。 (選擇十六進制(aes_encrypt(file,'key')); 2.選擇aes_decrypt(unhex(file),'key');

0

檢查您的字段類型是blob而不是二進制(32)