由此引發了對MD5加密的擔憂。
其實,從幾分鐘搜索得知的破解手段來看,無非就是暴力,字典,和海量數據庫這幾種手段,想了想,想要更可靠的保護好你的MD5還是很簡單的,希望開發人員多動腦,而不僅僅是baidu過來,能用就行了。
下面提供ORACLE下最簡單的MD5加密程序,和安全MD5加密程序。
經典MD5加密函數:
create or replace FUNCTION T_GET_MD5( p_str in varchar2)
RETURN varchar2 IS
BEGIN
RETURN lower(Utl_Raw.Cast_To_Raw(DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => Upper(p_str))));
END;
原創安全MD5加密函數
create or replace FUNCTION T_SECURE_MD5( p_str in varchar2)
RETURN varchar2 IS
BEGIN
RETURN lower(Utl_Raw.Cast_To_Raw(DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => Upper(SUBSTR(lower(Utl_Raw.Cast_To_Raw(DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => Upper(p_str)))),2,5)||'@Ray'||SUBSTR(lower(Utl_Raw.Cast_To_Raw(DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => Upper(p_str)))),-7,3)))));
END;
select T_SECURE_MD5('1233212') from dual;
1d5c582eaca5845c9233fe0bc4033123
select T_GET_MD5('1233212') from dual;
2e2de7dd00440bc773977e27407f11ca
通過這個號稱共有md5記錄457,354,352,282條的網站查一下,
http://www.cmd5.com/default.aspx
後者
查詢結果:
1233212
前者
查詢結果:
Not found
前者即使通過任何手段獲取,依然不是原始密碼,而是經過轉換過的“e2de7@Ray07f”
從原理上講,安全MD5加密函數是不可逆的。
如果並不在意標準的MD5輸出,甚者可以
create or replace FUNCTION T_SECURE_MD5( p_str in varchar2)
RETURN varchar2 IS
BEGIN
RETURN SUBSTR(lower(Utl_Raw.Cast_To_Raw(DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => Upper(SUBSTR(lower(Utl_Raw.Cast_To_Raw(DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => Upper(p_str)))),2,5)||'@Ray'||SUBSTR(lower(Utl_Raw.Cast_To_Raw(DBMS_OBFUSCATION_TOOLKIT.MD5(input_string => Upper(p_str)))),-7,3))))),7,12);
END;
既節省了存儲空間,又消滅了MD5的線索。