programing

Oracle의 MD5를 PHP의 MD5와 일치시키는 방법

css3 2023. 11. 6. 21:59

Oracle의 MD5를 PHP의 MD5와 일치시키는 방법

PHP에서 생성된 MD5 체크섬과 오라클 10g에서 생성된 체크섬을 비교하려고 합니다.하지만 저는 사과와 오렌지를 비교하고 있는 것 같습니다.

비교를 테스트하기 위해 수행한 작업은 다음과 같습니다.

//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 함수(위의 쿼리에서 볼 수 있음)는 '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à 

누가 두 사람을 맞추는데 도움을 줄 수 있습니까?

원시 바이트를 반환하므로 16진수로 변환해야 합니다.

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

Oracle 쿼리에서 인쇄되는 것은 대부분의 옥텟이 ASCII 문자가 아니기 때문에 md5 체크섬의 원시 바이트 스트림인 것으로 보입니다.먼저 16진수로 변환해 보십시오.

다음과 같은 함수를 만듭니다.

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"는 실제로 raw 형식으로 반환되지 않으므로 "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 --> lower conversion을 할 필요가 없는 것을 선호합니다.그러면 쿼리를 사용할 때마다 너무 많은 문제가 발생할 수 있습니다.런타임이 아닌 생성 시에 컴파일되기 때문에 저도 더 빠를 수 있다고 생각합니다만, 틀릴 수도 있습니다.

언급URL : https://stackoverflow.com/questions/1228685/getting-oracles-md5-to-match-phps-md5