DBMS_CRYPTO.ENCRYPT 在不同的 Oracle DB 版本中返回不同的结果

DBMS_CRYPTO.ENCRYPT returning different results in different oracle DB versions

我遇到了一个烦人的问题,我对此一无所知。使用 oracle dbms_crypto 包的 DBMS_CRYPTO.ENCRYPT 函数时,我在 oracle 11C 和 oracle 19 中得到了不同的结果。我首先注意到这个问题是在将数据库从 11c 迁移到 19c 并将 运行 迁移到问题解密存储的值。

以下 sql 查询说明了这个问题:

select rawtohex(DBMS_CRYPTO.ENCRYPT(src => UTL_I18N.STRING_TO_RAW ('TOENCRYPT', 'AL32UTF8'),typ => 5128 ,key => UTL_I18N.STRING_TO_RAW ('e24WwDYbk25wqe5pevJ3g3VJgyjXr6HX', 'AL32UTF8'))) from dual;

在 oracle 11c 中这个查询 returns 9A18D619A269A5AF9716F2869A8A4F5F 而在 oracle 19c 中它 returns 049AFACC8EC7AE239EC496E5B4534048.

我一直在试图弄清楚是什么导致了这种差异。我检查了查询的子部分,并将第一个差异隔离到加密函数的输出。

我也检查了 11g 的不同数据库,查询总是给出相同的结果。

其他人以前遇到过这个问题并且知道如何解决吗?或者有人可以给我一些关于什么会影响查询功能的指示吗?

@TenG 的提示很准确。

typ = 5128 = 0x1408 
             0x1000 PAD_PKCS5
             0x0400 CHAIN_OFB
             0x0008 ENCRYPT_AES256

11.2         9A18D619A269A5AF9716F2869A8A4F5F
12.1         049AFACC8EC7AE239EC496E5B4534048

根据 Oracle 支持文档 ID 2014909.1,OFB 模式在 11.2 中未正确实现,实际上是在执行 ECB 链接。

             0x1000 PAD_PKCS5
             0x0300 CHAIN_ECB
             0x0008 ENCRYPT_AES256
typ = 4872 = 0x1308 

11.2         9A18D619A269A5AF9716F2869A8A4F5F
12.1         9A18D619A269A5AF9716F2869A8A4F5F

换句话说,在11.2中,如果你要求OFB,你得到的却是ECB。如果你要求 ECB,你会在两个版本中得到相同的值。