2009-11-17 16 views
14

में एक पंक्ति का sha1-हैश बनाना Iracle डेटाबेस पर किसी चयन में पंक्ति के sha1-hash बनाने में कोई समस्या है।ओरेकल

SELECT *,HASHBYTES('SHA1',CAST(ID as varchar(10)+ 
    TextEntry1+TextEntry2+CAST(Timestamp as varchar(10)) as Hash 
FROM dbo.ExampleTable 
WHERE ID = [foo] 

हालांकि, मैं एक समान कार्य जब Oracle के साथ काम कर उपयोग करने के लिए खोजने के लिए प्रतीत नहीं कर सकते हैं: इस प्रकार मैं MSSQL में यह किया है। जहाँ तक मेरी Googling मुझे लाया गया है, मैं dbms_crypto.hash_sh1 अनुमान लगा रहा हूँ इसके साथ कुछ करने के लिए है, लेकिन मैं इसे चारों ओर मेरे मस्तिष्क रैप करने के लिए अभी तक नहीं कर पाए हैं ...

किसी भी संकेत दिए गए बहुत होगा की सराहना की।

उत्तर

23

पैकेज DBMS_CRYPTO हैश उत्पन्न करने के लिए सही पैकेज है। इसे डिफ़ॉल्ट रूप से सार्वजनिक रूप से नहीं दिया जाता है, आपको इसे विशेष रूप से (GRANT EXECUTE ON SYS.DBMS_CRYPTO TO user1) देना होगा।

इस फ़ंक्शन का परिणाम डेटाटाइप RAW है। आप इसे RAW कॉलम में संग्रहीत कर सकते हैं या इसे पर RAWTOHEX या UTL_ENCODE.BASE64_ENCODE फ़ंक्शंस का उपयोग करके संग्रहीत कर सकते हैं। RAW, CLOB और BLOB:

HASH समारोह इनपुट के रूप में तीन डेटाटाइप्स स्वीकार करने के लिए ओवरलोड हो गया है। rules of implicit conversion के कारण, यदि आप इनपुट के रूप में VARCHAR2 का उपयोग करते हैं, तो ओरेकल इसे RAW में परिवर्तित करने का प्रयास करेगा और अधिकतर विफल हो जाएगा क्योंकि यह रूपांतरण केवल हेक्साडेसिमल तारों के साथ काम करता है।

आप तो VARCHAR2 उपयोग करते हैं, उदाहरण के लिए, एक द्विआधारी डेटाप्रकार या एक CLOB के लिए इनपुट बदलने की आवश्यकता:

DECLARE 
    x RAW(20); 
BEGIN 
    SELECT sys.dbms_crypto.hash(utl_raw.cast_to_raw(col1||col2||to_char(col3)), 
           sys.dbms_crypto.hash_sh1) 
    INTO x 
    FROM t; 
END; 

आप की DBMS_CRYPTO.hash

+2

सहायता के लिए धन्यवाद। मुझे एक नियमित एसक्यूएल करते समय इसे काम करने के लिए निरंतर की बजाय dbms_crypto.hash_sh1 मान (पूर्णांक 3) का उपयोग करना था। SELECT.dsms_crypto.hash चुनें (utl_raw.cast_to_raw (col1), 3) टी से; – PrometheusDrake

+2

मुझे नहीं लगता कि यह 11 जी आर 2 के लिए बिल्कुल सही है। लगता है कि 'dbms_crypto.hash' में 'कच्चे',' ब्लॉब 'और' क्लोब 'के लिए 3 अधिभारित संस्करण हैं। 'varchar2' मान को' utl_i18n.string_to_raw' या 'utl_raw.cast_to_raw' के साथ स्पष्ट रूप से 'कच्चे' में परिवर्तित करना होगा। या चरित्र डेटा के लिए 'clobs' का उपयोग करें। – user272735

+0

क्या होगा यदि कुछ कॉलम हैं जिनमें स्ट्रिंग डेटा प्रकार नहीं है? – ca9163d9

7

DBMS_crypto दस्तावेज में अतिरिक्त जानकारी मिलेगी पैकेज varchar2 का समर्थन नहीं करता है। यह कच्चे प्रकार के साथ काम करता है, इसलिए यदि आपको वर्कर 2 की आवश्यकता है तो आपको इसे परिवर्तित करना होगा।

declare 
    p_string varchar2(2000) := 'Hello world !'; 
    lv_hash_value_md5 raw (100); 
    lv_hash_value_sh1 raw (100); 
    lv_varchar_key_md5 varchar2 (32); 
    lv_varchar_key_sh1 varchar2 (40); 
begin 
    lv_hash_value_md5 := 
    dbms_crypto.hash (src => utl_raw.cast_to_raw (p_string), 
         typ => dbms_crypto.hash_md5); 

    -- convert into varchar2 
    select lower (to_char (rawtohex (lv_hash_value_md5))) 
    into lv_varchar_key_md5 
    from dual; 

    lv_hash_value_sh1 := 
    dbms_crypto.hash (src => utl_raw.cast_to_raw (p_string), 
         typ => dbms_crypto.hash_sh1); 

    -- convert into varchar2 
    select lower (to_char (rawtohex (lv_hash_value_sh1))) 
    into lv_varchar_key_sh1 
    from dual; 

    -- 
    dbms_output.put_line('String to encrypt : '||p_string); 
    dbms_output.put_line('MD5 encryption : '||lv_varchar_key_md5); 
    dbms_output.put_line('SHA1 encryption : '||lv_varchar_key_sh1); 
end; 
3

आप अपने पसंदीदा पैकेज में इस समारोह को परिभाषित कर सकते हैं, मैं utils_pkg में परिभाषित: यहाँ एक नमूना ऐसा करने के तरीके दिखा कार्य है।

FUNCTION SHA1(STRING_TO_ENCRIPT VARCHAR2) RETURN VARCHAR2 AS 
BEGIN 
RETURN LOWER(TO_CHAR(RAWTOHEX(SYS.DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(STRING_TO_ENCRIPT), SYS.DBMS_CRYPTO.HASH_SH1)))); 
END SHA1; 

अब यह

SELECT UTILS_PKG.SHA1('My Text') AS SHA1 FROM DUAL; 

प्रतिक्रिया

SHA1 
-------------------------------------------- 
5411d08baddc1ad09fa3329f9920814c33ea10c0 

है कॉल करने के लिए आप कुछ मेज से एक स्तंभ का चयन कर सकते हैं:

SELECT UTILS_PKG.SHA1(myTextColumn) FROM myTable; 

का आनंद लें!