原创文章
转载 请注明来源 风潇潇的博客
http://blog.csdn.net/q2wxec/article/details/78906534
工作需要,需要加密clob字段,但网上很多教程都只能用于varchar的加密于是研究了一番,使用oracle官方的加密工具包,写出了,clob加密的存储过程和解密的存储过程
clob加密到blob
--使用加密包需要oracle系统管理员权限,grant execute on dbms_crypto to ****
CREATE OR REPLACE
procedure ENCRYPT_CLOBTOBLOB --加密CLOB,加密到BLOB
Authid Current_User --授予存储过程当前用户权限
as
input_CLOB CLOB; --加密输入CLOB选择器
output_BLOB_EN BLOB; --加密输出BLOB选择器
num_key_bytes NUMBER := 256/8; -- key长度
key_bytes_raw RAW (32); -- 存储32长度的raw型的key
encryption_type PLS_INTEGER := -- 加密算法的相关参数
DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
BEGIN
--输入与输出选择器赋值
SELECT DOC_CONTENT INTO input_CLOB FROM TB_DOC WHERE id='123456';
--输出将覆盖选择位置的原始值需要锁表且原始值不能为空
--lob默认值可使用empty_clob(),empty_blob()
SELECT ENCRYPT_DOC INTO output_BLOB_EN FROM TB_ENCRYPT_DOC WHERE id='123456'for update;
--转换key类型为raw
key_bytes_raw := UTL_RAW.CAST_TO_RAW ('ufsidf89ew8r9fh378fn837dwf893fgf');
DBMS_CRYPTO.ENCRYPT
(
dst => output_BLOB_EN,
src => input_CLOB,
typ => encryption_type,
key => key_bytes_raw,
iv => NULL --使用默认值null
);
commit;
END;
解密blob到clob
CREATE OR REPLACE
procedure DECRYPT_BLOBTOCLOB
Authid Current_User
as
output_CLOB CLOB;
input_BLOB_EN BLOB;
num_key_bytes NUMBER := 256/8; -- key length 256 bits (32 bytes)
key_bytes_raw RAW (32); -- stores 256-bit encryption key
encryption_type PLS_INTEGER := -- total encryption type
DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
-- iv_raw RAW (16);
BEGIN
SELECT ENCRYPT_DOC INTO input_BLOB_EN FROM TB_ENCRYPT_DOC WHERE id='123456';
SELECT ENCRYPT_DOC_CLOB INTO output_CLOB FROM TB_ENCRYPT_DOC WHERE id='123456' for update;
key_bytes_raw := UTL_RAW.CAST_TO_RAW ('ufsidf89ew8r9fh378fn837dwf893fgf');
-- iv_raw := DBMS_CRYPTO.RANDOMBYTES (16);
DBMS_CRYPTO.DECRYPT
(
dst => output_CLOB,
src => input_BLOB_EN,
typ => encryption_type,
key => key_bytes_raw,
iv => NULL
);
commit;
END;