MySql和Oracle加密函数兼容性

Posted 浩浩点滴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql和Oracle加密函数兼容性相关的知识,希望对你有一定的参考价值。

  公司有个收单项目,为了央行合规检查,一些敏感字段需要加密存储(如卡号等),该系统是基于Oracle,加密密方法是基于Oracle的DBMS_CRYPTO包来实现Function,应用通过调用Function来实现加密和解密的;现在该系统的数据库要从Oracle迁移到mysql,为了避免数据迁移,最好在MySql也实现同样功能的加密Function,Mysql也有AES_DECRYPT和AES_ENCRYPTh函数,做了一下实验对比,发现同样的原文MySql加密结果和Oracle加密结果不一样。

MySql加密方法:

select HEX(AES_ENCRYPT('hello world', 'key'));

Oracle加密方法:select DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(‘hello world‘),DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,UTL_I18N.STRING_TO_RAW(’key‘)) from dual;

MySql的AES_ENCRYPT没有设置AES具体分块方法和Padding方法,后来查资料可以通过以下方法设置:

SET block_encryption_mode = 'aes-128-cbc';

默认通过是‘aes-128-ecb'

通过SELECT @@session.block_encryption_mode; 语句可以查看

设置好在再执行下述的SQL

select HEX(AES_ENCRYPT('hello world', 'key', '0000000000000000'));

其中'0000000000000000' 为CBC分块所需要的向量;查看Oracle DBMS_CRYPTO.ENCRYPT的API,默认为NULL,就是说可以不设置,那应该是多少呢?


在DBMS_CRYPTO.DECRYPT API中有说明,默认为all zero;

但上述SQL执行结果还是和Oracle的执行结果不符;

后来想起all zero,应该是二进制的16个0,而不是字符串16个0;改为这样:

select HEX(AES_ENCRYPT('hello world', 'key', UNHEX('00000000000000000000000000000000')));


执行结果和Oracle执行相符。OK,完工,花费了一下午时间。

注:由于原来的加密会涉及敏感数据(主要是密钥),所以文中例子数据都是非实际例子。

以上是关于MySql和Oracle加密函数兼容性的主要内容,如果未能解决你的问题,请参考以下文章

AS 兼容性:“.. from T as a..”适用于 MySQL 和 SQL Server,而不适用于 Oracle? [复制]

mysql和oracle兼容

mysql和sql server和oracle的区别

C# 和 PL/SQL 中的加密和解密兼容性

Mybatis中SqlMapper配置的扩展与应用

PostgreSQL Oracle 兼容性之存储过程