Oracle 如何MD5加密

Oracle 如何MD5加密_第1张图片


问题描述:

UG 的系统发现了问题, 经检查发现一种资源设备上有个字段应该被加密但是没有MD5加密,造成设备信息传递给接口后无法识别,引起了设备秘钥不正确的错误

经过排查发现这一批设备在入库的时候,内部编码字段没有加密,所以入库后表中的字段是非加密的数值,因此需对这一批数据做修复

首先想到的是DBMS_OBFUSCATION_TOOLKIT.MD5,它是MD5编码的数据包函数

SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => 字段名)

 测试对TEST进行MD5加密


SQL> SELECT SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => 'TEST') FROM DUAL;
 
SYS.DBMS_OBFUSCATION_TOOLKIT.M
--------------------------------------------------------------------------------
;貹h卒鹬D蒙^5?

DBMS_OBFUSCATION_TOOLKIT.MD5返回的字串,是RAW类型,所以无法正常显示加密的值

,因此要正确显示, 就需要使用 Utl_Raw.Cast_To_Raw 转换,

SQL> SELECT UTL_RAW.CAST_TO_RAW(SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => 'TEST'))
  2    FROM DUAL;
 
UTL_RAW.CAST_TO_RAW(SYS.DBMS_O
--------------------------------------------------------------------------------
033BD94B1168D7E4F0D644C3C95E35BF

解决方案:

查询出设备的的值, 然后对字段做MD5加密处理后问题解决

DECLARE

  V_MD5 VARCHAR2(5012);
  
  CURSOR C_DATA IS
    SELECT TE.PHYID, TE.INCODESTR 
      FROM T_PHY TE 
     WHERE TE.TYPE = 'F0908';
    
BEGIN

  FOR V_DATA IN C_DATA LOOP
    --MD5加密
    V_MD5 := UTL_RAW.CAST_TO_RAW(SYS.DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => V_DATA.INCODESTR));
    --更新
    UPDATE T_PHY TE
       SET TE.INCODESTR = LOWER(V_MD5)
     WHERE TE.PHYID = V_DATA.TE.PHYID
     
  END LOOP;
  COMMIT;
END;

问题虽然解决, 之后想想MD5加密是常用函数,后续的脚本中也可能用用到,因此将其修改成函数,方便以后使用

CREATE OR REPLACE FUNCTION MD5(PASSWD IN VARCHAR2) RETURN VARCHAR2 IS
  --PASSWD 需要加密的字符
  --@REMARK:MD5加密
  VAL VARCHAR2(32);
BEGIN
  VAL := UTL_RAW.CAST_TO_RAW(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => PASSWD));
  RETURN VAL;
END;

测试,函数运行正确

SQL> SELECT LOWER(MD5('TEST')) FROM DUAL;
 
LOWER(MD5('TEST'))
--------------------------------------------------------------------------------
033bd94b1168d7e4f0d644c3c95e35bf

   

上一篇:Oracle 字符null 处理,有点儿晕了

你可能感兴趣的:(数据存储,oracle,数据库,database)