PHP'nin MD5 maç Oracle'ın MD5 Başlarken

5 Cevap php

Ben Oracle 10g tarafından oluşturulan bir PHP tarafından oluşturulan bir MD5 sağlama karşılaştırmak çalışıyorum. Ancak ben elmalarla armutların karşılaştırılması ediyorum görünüyor.

Burada karşılaştırma test yaptım:

//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 (yukarıdaki sorguda görülen) md5 fonksiyonu 'dbms_obfuscation_toolkit.md5' paketi kullanır ve bu gibi tanımlanır:

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;

Ne benim PHP sayfada çıkıyor olduğunu:

29dbb90ea99a397b946518c84f45e016

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

Herkes iki maç almak bana yardımcı olabilir misiniz?

5 Cevap

Bu ham bayt döndürür, sen altıgen içine dönüştürmek gerekir.

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

Bu, bu sekizli en ASCII karakter olmayacak çünkü ne Oracle sorgudan yazdırılan ediliyor karıştırılmış md5 sağlama ham bayt akışı olduğunu görünür. İlk onaltılık dönüştürerek deneyin.

Aşağıdaki gibi bir işlev oluşturun:

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;

ve bu gibi diyoruz:

select md5('foobar') from dual;

o "dbms_obfuscation_toolkit.md5" gerçekten "utl_raw.cast_to_raw" diyoruz dolayısıyla gerek ham biçiminde dönmez gibi görünüyor. Ama yanlış olabilir, bunun için daha iyi bir açıklaması olmalıdır.

Eğer Oracle md5 olmasını isterim durumda, bu yöntemi kullanabilirsiniz:

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

Ben aynı "sayısal değeri veya hata" var ve iki işlevi birlikte çalışmak bulundu:

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;

Sonra da sağlama almak için bu sorguyu çalıştırabilirsiniz:

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

Bu ikinci işlevi sağlamak işleve Bazz tarafından sağlanan SELECT deyimini veren olarak aynı şeyi yapar, ama ben rawToHex yapmak zorunda değil tercih -> düşük dönüşüm her sorgu içinde. Bu potansiyel yanlış sorguyu kullanmak her zaman gitmek için çok şey bırakır. Ben zamanında yaratılış zaman yerine derlenmiş, ama ben bu konuda yanlış olabilir çünkü çok daha hızlı olabilir düşünüyorum.