11

PHPによって生成されたMD5チェックサムをOracle10gによって生成されたものと比較しようとしています。しかし、私はリンゴとオレンジを比較しているようです。

比較をテストするために私が行ったことは次のとおりです。

//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];

Oracleの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à 

誰かが2つを一致させるのを手伝ってくれますか?

4

5 に答える 5

14

生のバイトを返します。これを16進数に変換する必要があります。

$x = unpack("H*", $row[0]); 
echo $x[1];
于 2009-08-04T16:59:53.037 に答える
7

Oracleクエリから出力されているのは、md5チェックサムの生のバイトストリームであるように見えます。これらのオクテットのほとんどはASCII文字ではないため、マングルされています。最初に16進数に変換してみてください。

于 2009-08-04T16:59:23.690 に答える
3

次のような関数を作成します。

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」を呼び出す必要があります。私は間違っているかもしれませんが、これについてはもっと良い説明があるはずです。

于 2010-04-16T10:37:38.377 に答える
2

Oracleにmd5が必要な場合は、次の方法を使用できます。

select lower(rawtohex(md5hash('foobar'))) from dual
于 2009-12-18T15:04:59.780 に答える
1

同じ「数値または値のエラー」が発生し、2つの関数が一緒に機能することがわかりました。

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;

この2番目の関数は、指定した関数に対してBazzが提供するSELECTステートメントを発行するのと同じことを行いますが、すべてのクエリ内でrawToHex->より低い変換を行う必要はありません。そのため、クエリを使用するたびに問題が発生する可能性があります。実行時ではなく作成時にコンパイルされるので、それも速いかもしれないと思いますが、私はそれについて間違っているかもしれません。

于 2010-02-22T23:34:30.057 に答える