我试图比较由PHP生成一个由Oracle 10g中产生一个MD5校验和。但是似乎我比较苹果和橘子。

下面就是我所做的测试对比:

//md5 tests

  //php md5
  print md5('testingthemd5function');

  print '<br/><br/>';

  //oracle md5
  $md5query = "select md5hash('testingthemd5function') from dual";

  $stid = oci_parse($conn, $md5query);
  if (!$stid) {
   $e = oci_error($conn);
   print htmlentities($e['message']);
   exit;
  }

  $r = oci_execute($stid, OCI_DEFAULT);
  if (!$r) {
   $e = oci_error($stid);
   echo htmlentities($e['message']);
   exit;
  }

  $row = oci_fetch_row($stid); 
  print $row[0];

在MD5函数中的Oracle(在上面的查询看到的)使用“dbms_obfuscation_toolkit.md5”包,并且被定义像这样(?):

CREATE OR REPLACE FUNCTION PORTAL.md5hash (v_input_string in varchar2) return varchar2     
is
   v_checksum varchar2(20);
   begin
   v_checksum := dbms_obfuscation_toolkit.md5 (input_string => v_input_string);
   return v_checksum;
end;

什么出来我的PHP页面是:

29dbb90ea99a397b946518c84f45e016

)Û¹©š9{”eÈOEà 

谁能帮我在得到两个匹配?

有帮助吗?

解决方案

它返回原始字节,你需要将其转换为十六进制。

$x = unpack("H*", $row[0]); 
echo $x[1];

其他提示

似乎真实正在从Oracle查询打印的内容是MD5校验的原始字节流,错位的,因为大多数的那些八比特组将不会是ASCII字符。尝试将其转换第一为十六进制。

创建像下面的函数:

create or replace
function md5( input varchar2 ) return sys.dbms_obfuscation_toolkit.varchar2_checksum as
begin
    return lower(rawtohex(utl_raw.cast_to_raw(sys.dbms_obfuscation_toolkit.md5( input_string => input ))));
end;

和调用它是这样的:

select md5('foobar') from dual;

似乎“dbms_obfuscation_toolkit.md5”并没有真正恢复以原始格式,因此需要调用“utl_raw.cast_to_raw”。我可能是错的,应该有这更好的解释。

在情况下,你会想在Oracle中的MD5,你可以用这个方法:

select lower(rawtohex(md5hash('foobar'))) from dual

我得到了相同的“数字或值错误”,并发现有两个功能一起工作:

CREATE OR REPLACE FUNCTION MD5RAW( v_input_string in varchar2 )
RETURN varchar2 IS
v_checksum varchar2( 32 );
BEGIN
    v_checksum := SYS.DBMS_OBFUSCATION_TOOLKIT.MD5( input_string => v_input_string );
    return v_checksum;
END;

CREATE OR REPLACE FUNCTION MD5HEX( v_input_string in varchar2 )
RETURN varchar2 IS
v_hex_value varchar2( 32 );
BEGIN
    SELECT  LOWER( RAWTOHEX( MD5RAW( v_input_string ) ) ) 
    INTO    v_hex_value
    FROM    dual;
    return v_hex_value;
END;

然后你可以运行此查询,让您的校验:

SELECT md5hex( 'my string smoked your hash' ) FROM dual;

这是第二个函数做同样的事情,通过发放对Bazz您所提供的功能提供的SELECT语句,但我宁愿没有做RAWTOHEX - >较低的每个查询的内部转换。这使得太多的东西需要在每次使用查询时可能会出问题。我想这可能是也更快,因为它是在创建时,而不是在运行时编译,但我可能是错了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top