0

我收到了一个包含 1000 万行数据的大型加密文件。

我需要将它加载到 oracle 数据库中(以加密形式),然后使用 pl/sql 和 oracle 内置的 dbms_crypto 在数据库中对其进行解密。

然后我需要处理未加密的 LOB 以分离出 1000 万行。

我将拥有该文件的公钥。该文件的大小约为 5GB。这可能只使用 pl/sql 吗?(和 oracle 内置程序)

有没有人有做这种事情的经验?- 任何指针都将受到欢迎。

谢谢

4

1 回答 1

1

这对我有用。

SYS 必须:

GRANT EXECUTE ON DBMS_CRYPTO TO <user>

在用户中:

CREATE OR REPLACE DIRECTORY
CRYPTDIR AS
'<crypted files directory>';

CREATE TABLE TESTCRYPT (ID INTEGER, E BLOB, D BLOB);

CREATE OR REPLACE FUNCTION load_Blob_FromFile(p_file_name VARCHAR2) 
RETURN BLOB
AS
   dest_loc  BLOB := empty_blob();
   src_loc   BFILE := BFILENAME('CRYPTDIR', p_file_name);
BEGIN
   -- Open source binary file from OS
   DBMS_LOB.OPEN(src_loc, DBMS_LOB.LOB_READONLY);

   -- Create temporary LOB object
   DBMS_LOB.CREATETEMPORARY(
         lob_loc => dest_loc
       , cache   => true
       , dur     => dbms_lob.session
   );

   -- Open temporary lob
   DBMS_LOB.OPEN(dest_loc, DBMS_LOB.LOB_READWRITE);

   -- Load binary file into temporary LOB
   DBMS_LOB.LOADFROMFILE(
         dest_lob => dest_loc
       , src_lob  => src_loc
       , amount   => DBMS_LOB.getLength(src_loc));

   -- Close lob objects
   DBMS_LOB.CLOSE(dest_loc);
   DBMS_LOB.CLOSE(src_loc);

   -- Return temporary LOB object
   RETURN dest_loc;
END;
/

INSERT INTO TESTCRYPT (ID, E) SELECT 1, LOAD_BLOB_FROMFILE('EncryptedFile') FROM DUAL;


CREATE OR REPLACE FUNCTION DCRYPT2(TO_DECRYPT IN BLOB) RETURN BLOB
IS
  DECRYPTED BLOB;
  v_key  PLS_INTEGER :=
      DBMS_CRYPTO.ENCRYPT_AES128 +
      DBMS_CRYPTO.CHAIN_ECB +
      DBMS_CRYPTO.PAD_PKCS5;
BEGIN
dbms_lob.createtemporary(DECRYPTED,true);
DBMS_CRYPTO.DECRYPT(DECRYPTED,
                    TO_DECRYPT,
                     v_key,
                     '<Hex-Key>'
                    );
RETURN DECRYPTED;
END;

更新 TESTCRYPT 集 D = DCRYPT2(E) 其中 ID=1;


CREATE OR REPLACE FUNCTION PADIS_MASTER.blob2clob (p_in blob) RETURN clob IS
     v_clob    clob;
     v_varchar VARCHAR2(32767);
     v_start   PLS_INTEGER := 1;
     v_buffer  PLS_INTEGER := 32767;
   BEGIN
     dbms_lob.createtemporary(v_clob, TRUE);
     FOR i IN 1..CEIL(dbms_lob.getlength(p_in) / v_buffer)
     LOOP
       v_varchar := utl_raw.cast_to_varchar2(dbms_lob.SUBSTR(p_in, v_buffer, v_start));
       dbms_lob.writeappend(v_clob, LENGTH(v_varchar), v_varchar);
       v_start := v_start + v_buffer;
     END LOOP;
     RETURN v_clob;
   END;
/

从 ID = 1 的 TESTCRYPT 中选择 BLOB2CLOB(D);


例如 Oracle 11 使用以下键编译:'b1b7adc285e82db81ea17f7be706e4f7'

最后是加密功能:

CREATE OR REPLACE FUNCTION ECRYPT(TO_CRYPT IN BLOB) RETURN BLOB
IS
 CRYPTED BLOB;
 v_key  PLS_INTEGER :=  DBMS_CRYPTO.ENCRYPT_AES128 
                      + DBMS_CRYPTO.CHAIN_ECB 
                      + DBMS_CRYPTO.PAD_PKCS5;
BEGIN
 dbms_lob.createtemporary(AUSGABE,true);
 DBMS_CRYPTO.ENCRYPT(CRYPTED,
                     TO_CRYPT,
                     v_key,
                     'b1b7adc285e82db81ea17f7be706e4f7'
                    );
 RETURN CRYPTED;
END;
于 2015-03-26T06:25:01.767 回答