我需要比较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