永发信息网

如何取BLOB类型的MD5加密值

答案:2  悬赏:40  手机版
解决时间 2021-12-21 11:23
如何取BLOB类型的MD5加密值
最佳答案
from ragini.deshpande
Here is the my_encryption package code ...........

CREATE OR REPLACe PACKAGE BODY my_encryption IS

ps_encryption_key RAW(32);


INTERNAL_BAD_KEY exception;
PRAGMA EXCEPTION_INIT(INTERNAL_BAD_KEY, -28231);


INTERNAL_BAD_DATA exception;
PRAGMA EXCEPTION_INIT(INTERNAL_BAD_DATA, -28232);


FUNCTION get_case_encryption_key(pi_cas_id IN ELS_CASES.ID%TYPE) RETURN RAW IS


key RAW(16);


CURSOR c_case_key(b_cas_id ELS_CASES.ID%TYPE) IS
SELECT encryption_key
FROM els_cases
WHERe id = b_cas_id;

BEGIN

OPEN c_case_key(pi_cas_id);
FETCH c_case_key INTO key;
CLOSE c_case_key;
RETURN key;

EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE NO_CASE;
END;


PROCEDURE set_master_key(pi_key IN RAW) IS
BEGIN
IF LENGTHB(pi_key) != 32 THEN
RAISE BAD_KEY;
END IF;
ps_encryption_key := pi_key;
END;


FUNCTION set_master_key(pi_key IN RAW) RETURN VARCHAR2 IS
BEGIN
set_master_key(pi_key);
RETURN 'Y';
END;


PROCEDURE set_case_key(pi_master_key IN RAW,
pi_cas_id IN ELS_CASES.ID%TYPE) IS
BEGIN
ps_encryption_key := pi_master_key;
ps_encryption_key := decrypt(pi_data=>get_case_encryption_key(pi_cas_id));
END;


FUNCTION set_case_key(pi_master_key IN RAW,
pi_cas_id IN ELS_CASES.ID%TYPE) RETURN VARCHAR2 IS
BEGIN
set_case_key(pi_master_key,pi_cas_id);
RETURN 'Y';
END;


FUNCTION encrypt(pi_data IN RAW) RETURN RAW IS
BEGIN
RETURN dbms_obfuscation_toolkit.DES3Encrypt(input => pi_data,
key => ps_encryption_key);
EXCEPTION
WHEN INTERNAL_BAD_DATA THEN
RAISE BAD_DATA;
WHEN INTERNAL_BAD_KEY THEN
RAISE BAD_KEY;
END;


FUNCTION encrypt(pi_blob IN BLOB) RETURN BLOB IS


result blob;


blob_length PLS_INTEGER := dbms_lob.getlength(pi_blob);


max_chunk_length PLS_INTEGER := 2000;


chunk_length PLS_INTEGER;


pointer PLS_INTEGER := 1;


chunk RAW(2000);


pad RAW(1) := utl_raw.substr(utl_raw.cast_to_raw('0'),1,1);

BEGIN


dbms_lob.createtemporary(result, TRUE, dbms_lob.call);


WHILE (pointer <= blob_length) LOOP


chunk_length := LEAST(max_chunk_length,blob_length-pointer+1);
chunk := dbms_lob.substr(pi_blob,chunk_length,pointer);


WHILE mod(chunk_length,8) !=0 LOOP
chunk := utl_raw.concat(chunk,pad);
chunk_length := chunk_length+1;
END LOOP;


dbms_lob.writeappend(result,
chunk_length,
encrypt(pi_data => chunk)
);


pointer := pointer + chunk_length;
END LOOP;


RETURN result;
END;


FUNCTION decrypt(pi_data IN RAW) RETURN RAW IS
BEGIN
RETURN dbms_obfuscation_toolkit.DES3Decrypt(input => pi_data,
key => ps_encryption_key);
EXCEPTION
WHEN INTERNAL_BAD_DATA THEN
RAISE BAD_DATA;
WHEN INTERNAL_BAD_KEY THEN
RAISE BAD_KEY;
END;


FUNCTION decrypt(pi_blob IN BLOB,
pi_size IN PLS_INTEGER) RETURN BLOB IS

result BLOB;


blob_length PLS_INTEGER := dbms_lob.getlength(pi_blob);


max_chunk_length PLS_INTEGER := 2000;


chunk_length PLS_INTEGER;


pointer PLS_INTEGER := 1;

BEGIN


dbms_lob.createtemporary(result, TRUE, dbms_lob.call);


WHILE (pointer <= blob_length) LOOP


chunk_length := LEAST(max_chunk_length,blob_length-pointer+1);


dbms_lob.writeappend(result,
chunk_length,
decrypt(pi_data => dbms_lob.substr(pi_blob,
chunk_length,
pointer
)
)
);


pointer := pointer + chunk_length;
END LOOP;


dbms_lob.trim(result,pi_size);


RETURN result;
END;


PROCEDURE CLEAR IS
BEGIN
ps_encryption_key:=null;
END;

END;
/

and here is the PL/sql I run before running the sql stmt

DECLARE

mkey LONG RAW;

BEGIN

mkey := UTL_RAW.CAST_TO_RAW ('&&key');

my_encryption.set_master_key(mkey);

my_encryption.set_case_key(mkey,&&case_id);

END;

mkey is a 16 digit key .
and the encrypted_contents I'm trying to decrypt is a BLOB.

select my_encryption.decrypt(encrypted_contents,file_size),mime_type
from my_drafts where id = &&draft_id;

I hope this makes sense .

Ragini
全部回答
当您将此哈希算法应用到任意数量的数据例如,一个二进制文件,结果是一个散列或消息摘要。此哈希具有固定的大小。md5 是创建一个 128 位的哈希值的哈希算法。sha-1 是创建一个 160 位的哈希值的哈希算法。 文件校验和完整性验证程序 (fciv) 实用程序可用于计算一个文件的 md5 或 sha-1 加密哈希值。有关文件校验和完整性验证程序 (fciv) 实用程序的其他信息,请单击下面的文章编号,以查看 microsoft 知识库中相应的文章: 841290可用性和文件校验和完整性验证程序实用程序的说明 计算的 md5 和 sha-1 哈希值的文件,请在命令行键入以下命令: fciv-md5-sha1 path\filename.ext 例如,若要计算在%systemroot%文件夹中 \system32 shdocvw.dll 文件的 md5 和 sha-1 哈希值,请键入下面的命令: fciv-md5-sha1 c:\windows\system32\shdocvw.dll 这篇文章中的信息适用于: customer service and support information 关键字: kbmt kmcustomerservice kbhowto kb889768 kbmtzh 机器翻译 注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。 点击这里察看该文章的英文版: 889768 microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
国税年报怎么填
长征派出所办公地址在什么地方?我要处理点事
Let's go and 什么 our new english teac
帕克岚德地址在什么地方,想过去办事,
青草沙边防派出所位置在什么地方啊,我要过去
为什么你是我挥之不去的梦魇?
XP系统,虚拟内存最小值太低怎么办?
DNF的物品放在仓库里会不见吗?
新乡市郊赶会地点日期
英国个人旅游签证 被拒签 求助!
妻子的英语怎么说
She was afraid that unless the train speed
我改过名字改过生日该以什么算八字
在你的世界里好像没有我的存在,所以你从来都
京瓷M3560idn多功能一体机怎么样好不好
推荐资讯
亳州市国土资源局办公位置在哪啊?好找么?
停车场(陈仓园二路)地址在什么地方,想过去办
风尘仆仆的近义词
吉林省硅宝科技有限公司我想知道这个在什么地
毛家港水陆派出所位置在什么地方啊,我要过去
单选题现有甲、已、丙三个盒子,其中每个盒子
番禺区怎么读
家兔臼齿的功能是A.磨碎食物B.切断食物C.撕裂
揭阳市中山工商所在什么地方啊,我要处理点事
孝义市现在有多少家煤矿
吃什么食物可以补铁?
读图,回答问题(1)E山脉位于______省境内它
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?