Oracle查询密码加密串方法

方法也是参考网上牛人的结果改写的,原来作者的需求是验证用户名和明文密码是否匹配,当时觉得用处不是很大,因为我的需求是检查在线库是否有弱密码存在,最后发现原来这样是有原因的。因为Oracle的密码是根据用户名和密码共同生成的密码。也就是说,A用户使用APP作为密码和B用户使用APP作为密码,生成的密文是不一样的。

Oracle查询密码加密串方法

废话不多说,贴一下我改动的函数吧。修改的东西非常少,原来是从库里面进行验证,现在我只是想得到加密串:

 create or replace function testpwd(password in varchar2)
return varchar2
authid current_user
is
 --
 raw_key raw(128):= hextoraw('0123456789ABCDEF');
 --
 raw_ip raw(128);
 pwd_hash varchar2(16);
 --
 procedure unicode_str(userpwd in varchar2, unistr out raw)
 is
  enc_str varchar2(124):='';
  tot_len number;
  curr_char char(1);
  padd_len number;
  ch char(1);
  mod_len number;
  debugp varchar2(256);
 begin
  tot_len:=length(userpwd);
  for i in 1..tot_len loop
   curr_char:=substr(userpwd,i,1);
   enc_str:=enc_str||chr(0)||curr_char;
  end loop;
  mod_len:= mod((tot_len*2),8);
  if (mod_len = 0) then
   padd_len:= 0;
  else
   padd_len:=8 - mod_len;
  end if;
  for i in 1..padd_len loop
   enc_str:=enc_str||chr(0);
  end loop;
  unistr:=utl_raw.cast_to_raw(enc_str);
 end;
 --
 function crack (userpwd in raw) return varchar2
 is
  enc_raw raw(2048);
  --
  raw_key2 raw(128);
  pwd_hash raw(2048);
  --
  hexstr varchar2(2048);
  len number;
  password_hash varchar2(16); 
 begin
  dbms_obfuscation_toolkit.DESEncrypt(input => userpwd,
        key => raw_key, encrypted_data => enc_raw );
  hexstr:=rawtohex(enc_raw);
  len:=length(hexstr);
  raw_key2:=hextoraw(substr(hexstr,(len-16+1),16));
  dbms_obfuscation_toolkit.DESEncrypt(input => userpwd,
        key => raw_key2, encrypted_data => pwd_hash );
  hexstr:=hextoraw(pwd_hash);
  len:=length(hexstr);
  password_hash:=substr(hexstr,(len-16+1),16);
  return(password_hash);
 end;
begin
 unicode_str(upper(password),raw_ip);
 return crack(raw_ip);
end;
/

相关推荐