繁体   English   中英

将 Oracle 加密功能移植到 Postgres

[英]Port Oracle encryption function to Postgres

我正在尝试将 Oracle 函数移植到 Postgres。 此函数的目的是使用 AES-256 算法加密数据。 由于我不是 Oracle 或密码学方面的专家,我非常感谢所有可能的帮助。 目标是使用相同的数据和密钥在 Oracle 和 Postgres 中获得相同的加密结果。

Oracle 函数是

function encrypt(data varchar2, key raw) return raw as
begin
  return dbms_crypto.encrypt(
      utl_i18n.string_to_raw(data, 'AL32UTF8'),
      dbms_crypto.ENCRYPT_AES256
      + dbms_crypto.CHAIN_CBC
      + dbms_crypto.PAD_PKCS5,
      key
    );
end;

我知道这是一个旧线程,但我遇到了同样的问题。 这是使用 AES128 从 oracle/postgres 进行的相同加密/解密
我(到目前为止)还没有在 256 加密方面取得成功,但我也没有放弃。

    ORACLE  
    -----------------
      select RAWTOHEX ( DBMS_CRYPTO.encrypt (
                                          src   => UTL_I18N.STRING_TO_RAW ('TEST', 'AL32UTF8'),
                                          typ   => 6+256+4096/* DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5   */,
                                          key   => UTL_RAW.cast_to_raw (RPAD ('1234', (128/8))))) val
      from dual;
      --4710C33D1568176FD6862FC58930B274
      
      select  UTL_I18N.RAW_TO_CHAR (DBMS_CRYPTO.decrypt (
                                          src   => hextoraw('4710C33D1568176FD6862FC58930B274'),
                                          typ   => 6+256+4096/* DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5   */,
                                          key   => UTL_RAW.cast_to_raw (RPAD ('1234', (128/8)))), 'AL32UTF8') val
      from dual;
      --TEST
        
    POSTGRES  
    -----------------  
      select  upper(encode(encrypt('TEST', rpad('1234',128/8)::bytea, 'aes'),'HEX')) VAL;
      -- 4710C33D1568176FD6862FC58930B274 
       
       select convert_from(decrypt('\x4710C33D1568176FD6862FC58930B274',rpad('1234',128/8)::bytea,'aes'),'SQL_ASCII') VAL;
       --TEST 

您可以查看pgcrypto扩展的encrypt功能。 它可能不是 100% 的替代品,但也许已经足够接近了。

我不是 Postgres 的专家,但似乎 Postgres DBMS_CRYPTO 包只包含在封闭源代码 Postgres EDB 中,而不是 PostgreSQL,并且它只支持 RAW、BLOB 和 CLOB 数据类型,不支持 VARCHAR2。 此外,它支持与 Oracle 不同的一组密码,没有比 AES128 强的密码。 有关详细信息,请参见此处: https : //www.enterprisedb.com/edb-docs/d/edb-postgres-advanced-server/user-guides/database-compatibility-for-oracle-developers-built-in-package-guide /12/Database_Compatibility_for_Oracle_Developers_Built-in_Package_Guide.1.16.html

简而言之,您似乎无法完全按照自己的意愿去做(即使用 DBMS_CRYPTO)。 如果您使用的是 PostgreSQL,则需要查看其他一些替代方案,例如 pg_crypto。 如果您正在考虑 EDB,那么您将需要切换数据类型并牺牲一定程度的安全性来进行切换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM