2009-08-04 16 views
11

से मेल खाने के लिए ओरेकल के एमडी 5 प्राप्त करना मैं ओरेकल 10 जी द्वारा जेनरेट किए गए PHP से जेनरेट किए गए एमडी 5 चेकसम की तुलना करने की कोशिश कर रहा हूं। हालांकि ऐसा लगता है कि मैं संतरे से सेब की तुलना कर रहा हूं। (?)PHP के 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]; 

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; 

क्या मेरी पीएचपी पृष्ठ पर बाहर आता है:

29dbb90ea99a397b946518c84f45e016 

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

किसी को भी प्राप्त में मेरी मदद कर सकते दो मैच करने के लिए टिंग?

उत्तर

14

यह कच्चे बाइट्स देता है, आपको इसे हेक्स में परिवर्तित करने की आवश्यकता होती है।

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

धन्यवाद, यह एक आकर्षण की तरह काम करता है – Zenshai

7

ऐसा प्रतीत होता है कि ओरेकल क्वेरी से मुद्रित किया जा रहा है एमडी 5 चेकसम का कच्चा बाइटस्ट्रीम है, क्योंकि उनमें से अधिकतर ऑक्टेट्स असीसी वर्ण नहीं होंगे। पहले इसे हेक्साडेसिमल में परिवर्तित करने का प्रयास करें।

2

मामले में आप आप इस विधि का उपयोग कर सकते हैं, ओरेकल में md5 करना चाहते हैं:

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

जब मैं अपनी कॉल को लपेटने की कोशिश करता हूं - rawtohex (dbms_obfuscation_toolkit.md5 (input_string => टेक्स्ट)) - यह मुझे "संख्यात्मक या मूल्य त्रुटि: हेक्स से कच्चे रूपांतरण त्रुटि" बताता है, जो मजाकिया है क्योंकि मैं कच्चे में हेक्स को कच्चे में कच्चे में परिवर्तित करने की कोशिश नहीं कर रहा हूं। – eidylon

1

मैं एक ही "सांख्यिक या मूल्य त्रुटि" हो गया और पाया गया कि दो कार्य एक साथ काम:

SELECT md5hex('my string smoked your hash') 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; 

तो फिर आप अपने चेकसम प्राप्त करने के लिए इस क्वेरी चला सकते हैं 0

वह दूसरा फ़ंक्शन आपके द्वारा प्रदान किए गए फ़ंक्शन पर Bazz द्वारा प्रदान किए गए SELECT कथन जारी करने जैसा ही काम करता है, लेकिन मुझे प्रत्येक क्वेरी के अंदर कच्चेToHex -> कम रूपांतरण करने की आवश्यकता नहीं है। हर बार जब आप क्वेरी का उपयोग करते हैं तो संभावित रूप से गलत होने के लिए बहुत सारी चीज़ें छोड़ती हैं। मुझे लगता है कि यह तेजी से भी हो सकता है क्योंकि इसे रनटाइम के बजाय निर्माण समय पर संकलित किया गया है, लेकिन मैं इसके बारे में गलत हो सकता हूं।

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" वास्तव में, जरूरत कच्चे स्वरूप में वापस नहीं करता है इसलिए "utl_raw.cast_to_raw" को कॉल करने के लिए। हालांकि मैं गलत हो सकता हूं, इसके लिए एक बेहतर स्पष्टीकरण होना चाहिए।

संबंधित मुद्दे