我需要在函式內標記一些在 md5 中散列的資料。
我有表 BDM_TMP_MAIL_HARD 包含一些郵件。我需要將 md5 中另一個表的一些郵件與該表的郵件進行匹配。
我的帶有 MD5 格式郵件的表格
| 電子郵件MD5 | 比賽 |
|---|---|
| 8747e564eb53cb2f1dcb9aae0779c2aa | 1 |
| 4545e564eqsqdsb2f1dcb46ae0779c2aa | 0 |
表 BDM_TMP_MAIL_HARD
| 郵件 | TO_MD5(郵件) |
|---|---|
| 例子@gmail.com | 8747e564eb53cb2f1dcb9aae0779c2aa |
| 例子[email protected] | 368e564eqsq4242f1dc344242d79c2aa |
我使用了一個從另一個包中獲取的名為“to_md5”的函式,它將郵件轉換為 md5。所以,我將在表 BDM_TMP_MAIL_HARD 上使用這個函式。
問題是當我執行函式時,它永遠不會結束。
我已經做了多次測驗,選擇計數是正確的,如果我嘗試在沒有功能的情況下進行更新,它會起作用。如果我在沒有 to_md5() 的情況下執行該函式,它會起作用。
只要我把函式放在 to_md5 里面,這個函式就永遠不會結束。
為什么該函式在沒有 to_md5() 函式的情況下作業?
UPDATE MY_TABLE SET MATCH =
FILTRE_MARKET_OP.FILTRE_V1_MARKET_OP_MD5(lower(emailMD5));
FUNCTION FILTRE_V1_MARKET_OP_MD5(mail IN varchar) RETURN NUMBER IS
hard number;
mail_filtre varchar2(300);
BEGIN
hard := 0;
mail_filtre := mail;
SELECT count(*) INTO hard FROM BDM_TMP_MAIL_HARD
WHERE EMAIL IS NOT NULL
AND to_md5(email) = mail_filtre;
IF hard >= 1 THEN
hard := 1;
GOTO FIN;
END IF;
<<FIN>>
RETURN hard;
END FILTRE_V1_MARKET_OP_MD5;
否則,因為這不起作用,我手動進行更新:
update MY_TABLE set MATCH = 1
where lower(emailMD5) in
( select to_md5(lower(EMAIL))
from BDM_TMP_MAIL_HARD
where EMAIL is not null )
and emailMD5 is not null;
這是我的自定義 md5 函式:
create or replace FUNCTION to_MD5 (str IN VARCHAR2)
RETURN VARCHAR2
IS
v_checksum VARCHAR2(32);
BEGIN
v_checksum := LOWER( RAWTOHEX( UTL_RAW.CAST_TO_RAW( sys.dbms_obfuscation_toolkit.md5(input_string => str) ) ) );
RETURN v_checksum;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END to_MD5;
uj5u.com熱心網友回復:
是optima.to_md5(email)自定義函式你寫生成MD5哈希?如果您使用的是 Oracle 12c 或更高版本,最好使用STANDARD_HASH函式來生成像這樣的 MD5 哈希STANDARD_HASH(email, 'MD5')。
uj5u.com熱心網友回復:
dbms_obfuscation_toolkit 在 11G 之后被棄用,所以如果你曾經將你的支持升級到一個角落。
MD5 已被密碼破解并被認為是不安全的。
您應該使用 DBMS_CRYPTO:
select rawtohex(
DBMS_CRYPTO.Hash (
UTL_I18N.STRING_TO_RAW ('foo', 'AL32UTF8'), 2)
) from dual;
Output:
ACBD18DB4CC2F85CEDEF654FCCC4A4D8
這是我用來生成哈希密鑰的 SHA512 函式。請注意,如果您要存盤該值,則它應該位于定義為 RAW 的列中。
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;
/
SELECT HASH_SHA512('This is a SHA512 output') from dual
aae656dfa520d7609f45de886f8f677ea2fdebb88400c5c3d6e8412c221c99944c42d167f6b3401c12a9636ea6121ae610861b1e3340a0ddba7e0ea096a64f75
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/402003.html
