我需要比较Oracle数据库和MySQL数据库之间的数据。
在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
我错过了什么吗?或者不同语言之间的加密方法不一样?
更新:
根据下面的注释,我相信我应该提到Oracle的DBMS_CRYPTO.Hash的结果与MySQL中的MD5函数返回的结果相同。
在Oracle中使用CBC或CBE也会得到相同的结果,因为IV没有被传递给该函数,因此使用了IV的缺省值,即NULL
BOUNTY:
如果有人可以验证我的最后一条评论,并且如果在双方使用相同的填充,将得到相同的结果可以得到赏金:
@rossum The default padding in MySQL is PKCS7, mmm... Oh.. In Oracle
it's using PKCS5, can't believe I didn't notice that. Thanks. (Btw
Oracle doesn't have the PAD_PKCS7 option, not in 11g at least)
本文探讨了Oracle使用AES-128加密并进行哈希处理的数据库安全特性,与MySQL中纯文本加密和MD5哈希的对比。作者发现两者加密结果不一致,重点在于Oracle使用PKCS5填充与MySQL的默认PKCS7差异。
939

被折叠的 条评论
为什么被折叠?



