我需要比較Oracle數據庫和MySQL數據庫之間的數據。Oracle和MySQL中的AES加密給出了不同的結果
在Oracle中,首先使用AES-128
算法對數據進行加密,然後進行散列處理。這意味着無法恢復數據並對其進行解密。
相同的數據在MySQL和純文本中可用。因此,爲了比較這些數據,我嘗試了加密,然後對MySQL數據進行哈希處理,同時遵循Oracle中完成的相同步驟。
經過大量嘗試後,我終於發現MySQL中的aes_encrypt
返回的結果與Oracle中的不同。
-- ORACLE:
-- First the key is hashed with md5 to make it a 128bit key:
raw_key := DBMS_CRYPTO.Hash (UTL_I18N.STRING_TO_RAW ('test_key', 'AL32UTF8'), DBMS_CRYPTO.HASH_MD5);
-- Initialize the encrypted result
encryption_type:= DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
-- Then the data is being encrypted with AES:
encrypted_result := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW('test-data', 'AL32UTF8'), encryption_type, raw_key);
爲Oracle碼結果將是:8FCA326C25C8908446D28884394F2E22
-- MySQL
-- While doing the same with MySQL, I have tried the following:
SELECT hex(aes_encrypt('test-data', MD5('test_key'));
爲MySQL代碼的結果將是:DC7ACAC07F04BBE0ECEC6B6934CF79FE
我缺少的東西?或者不同語言之間的加密方法不一樣?
UPDATE: 根據下面的評論,我相信我應該提的是,在甲骨文DBMS_CRYPTO.Hash
的結果是一樣的,通過在MySQL中MD5
函數返回的結果。
另外使用CBC
或者Oracle CBE
給出相同的結果,由於IV不被傳遞給函數,從而使用IV的缺省值,它是NULL
BOUNTY: 如果有人可以驗證我最後的評論,而事實上,如果使用兩面相同的填充,會產生相同的結果得到的賞金:
@rossum在MySQL默認填充是PKCS7,嗯...呵呵..在Oracle 它使用PK CS5,不敢相信我沒注意到。謝謝。 (Btw Oracle沒有PAD_PKCS7選項,至少不在11g中)
乍一看我懷疑問題在這裏:''test_key','AL32UTF8''方法MySQL在你的數據上有不同的字符集,因此在應用加密之前有不同的數據。 – Johan
我懷疑加密應該是相同的,所以我會確保密鑰是一樣的。即MD5是否返回十六進制字符串或原始字節。如果是十六進制,那麼情況如何?不幸的是我沒有安裝DBMS_CRYPTO的權限。 – Sodved
@Sodved是的MD5哈希在兩個數據庫'8C32D1183251DF9828F929B935AE0419'中給出了相同的結果。由於@Johan就是這種情況,它不應該是一個編碼問題,因爲MD5哈希是相同的 – Dan