Получение Oracle MD5, чтобы соответствовать MD5 PHP - PullRequest
11 голосов
/ 04 августа 2009

Я пытаюсь сравнить контрольную сумму MD5, сгенерированную PHP, с контрольной суммой, сгенерированной Oracle 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 (показанная в запросе выше) в 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à 

Может ли кто-нибудь помочь мне в подборе этих двух?

Ответы [ 5 ]

14 голосов
/ 04 августа 2009

Возвращает необработанные байты, вам нужно преобразовать это в гекс.

$x = unpack("H*", $row[0]); 
echo $x[1];
7 голосов
/ 04 августа 2009

Похоже, что то, что печатается из запроса Oracle, является необработанным контрольным потоком контрольной суммы md5, искаженным, потому что большинство этих октетов не будут символами ascii. Попробуйте сначала преобразовать его в шестнадцатеричное.

3 голосов
/ 16 апреля 2010

Создайте функцию, подобную следующей:

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". Хотя я могу ошибаться, должно быть лучшее объяснение этому.

2 голосов
/ 18 декабря 2009

Если вы хотите иметь md5 в Oracle, вы можете использовать этот метод:

select lower(rawtohex(md5hash('foobar'))) from dual
1 голос
/ 23 февраля 2010

Я получил ту же «ошибку числа или значения» и обнаружил, что две функции работают вместе:

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;

Эта вторая функция делает то же самое, что и оператор SELECT, предоставляемый Bazz для предоставляемой вами функции, но я предпочитаю не выполнять rawToHex -> более низкое преобразование внутри каждого запроса. Это оставляет слишком много вещей, которые потенциально могут пойти не так каждый раз, когда вы используете запрос. Я думаю, что это может быть и быстрее, так как он компилируется во время создания, а не во время выполнения, но я могу ошибаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...