【发布时间】:2021-09-10 18:18:05
【问题描述】:
我基于 clob 构建了一个 sha512 哈希 KEY,因此我可以轻松检查 clob 是否已经存在。
它基于一个 INSERT 触发器,该触发器旨在调用将创建哈希键的函数。
我可以成功地创建我的表、函数和触发器以及 INSERT 行。
我的下一步是存储在 INSERT 期间加密的 CLOB,并在 SELECT 期间为拥有特权的人在 SELECT 期间解密 CLOB。
我在互联网上发现了一些可以加密的代码(见下文),但我遇到的问题是能够解密 clob。我怀疑这应该是可能的,但我找不到任何如何完成此任务的示例。
其次,我在代码中看到了一个密钥,这意味着任何拥有 DBA 权限的人都可以查看源代码并看到密钥,这是我不想要的。
避免这种情况的最佳方法是将代码转换为包并加密包,使密钥和加密方法未知?
我怀疑在这个项目之后,一些敏感的字符串和 BLOB 将不得不经历同样的事情,所以我希望有一个非常灵活的解决方案来涵盖这些情况,或者做一些改动很小的事情,因为我不想重新发明轮子。
最后,如果有比我找到的更好的加密方法,请告诉我。因为我还没有绑定任何方法。
我们将不胜感激任何帮助和专业知识。提前感谢所有回答的人。我正在为任何想要模拟我的环境的人测试 livesql。
下面是一个简单的测试案例。为冗长的文章道歉。
CREATE table t(
seq_num integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
c CLOB,
hash VARCHAR2(1000)
);
CREATE or REPLACE FUNCTION HASH_SHA512 (
psINPUT IN VARCHAR2
) RETURN VARCHAR2 AS
rHash RAW (512);
BEGIN
rHash := DBMS_CRYPTO.HASH (TO_CLOB (psINPUT),
dbms_crypto.HASH_SH512);
RETURN (LOWER (RAWTOHEX (rHash)));
END HASH_SHA512;
create or replace
trigger trg
before insert on t
for each row
begin
:new.hash := HASH_SHA512(:new.c);
end;
insert into t (c) values (
rpad('z',32000,'z')
);
SELECT DBMS_LOB.getLength(c) from t;
select hash from t;
-- looking for a decrypt function for this code.
create or replace function clob_encrypt(ac_input IN CLOB) return blob is
lb_variable BLOB;
inverse_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_DES +
DBMS_CRYPTO.CHAIN_CBC +
DBMS_CRYPTO.PAD_PKCS5;
inverse_key RAW(32) := UTL_RAW.cast_to_raw( '1220248819');
begin
dbms_lob.createtemporary(lb_variable, true);
DBMS_CRYPTO.ENCRYPT(
dst => lb_variable,
src => ac_input,
typ => inverse_type,--dbms_crypto.des_cbc_pkcs5,
key => inverse_key
);
return lb_variable;
end clob_encrypt;
select clob_encrypt('test') from dual;
CLOB_ENCRYPT('TEST')
DEBD62BE84FC22A
【问题讨论】:
-
如果
DBMS_CRYPTO有ENCRYPT功能,那么它应该(合理地)有DECRYPT功能。 -
使用加密和解密并将所有内容包含在一个包中。然后使用
wrap加密代码。
标签: sql oracle encryption clob