आपकी पहली क्वेरी में वास्तव में कुछ भी गलत नहीं है, वाक्य-रचना की दृष्टि से यह हाजिर है क्योंकि यह काम किया हुआ उदाहरण प्रदर्शित करता है।
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 मिलता है जहां आपके पास ब्लॉक_एन्क्रिप्शन_मोड वैरिएबल अलग-अलग सेट होता है जब भंडारण और मूल्य पुनर्प्राप्त करने का प्रयास करते समय, जांचें कि आप सत्रों के बीच डिफ़ॉल्ट 'एईएस-128-ईबीसी' पर गलती से वापस नहीं जा रहे हैं। अन्य भी हो सकते हैं...
दूसरी क्वेरी विफल हो जाएगी क्योंकि आपको एन्क्रिप्शन और डिक्रिप्शन दोनों कार्यों के लिए iv की आपूर्ति करने की आवश्यकता है, आप इसे केवल एन्क्रिप्ट करने के लिए उपयोग करते हैं। साथ ही, चूंकि आप MyTable से मान ले रहे हैं, Encrypted_ID पहले से ही एन्क्रिप्ट किया जाएगा और इस क्वेरी का प्रभाव इसे फिर से एन्क्रिप्ट करना होगा, इसे उलटने से पहले आपको संग्रहीत (एन्क्रिप्टेड) मान पर वापस लाने के लिए।
अंत में, एईएस केवल 16 का उपयोग करने जा रहा है। बाइट्स iv का ताकि आप उस शब्दावली(16) को भी बना सकें।