2014-03-25 100 views
0
(解密)的一些列
  1. 如何在甲骨文11加密號碼 列做(也能夠解密回),使同一列存儲與(未加密的放在一起加密後的數字(基於一個布爾值保存在其他地方)?
  2. 我實際上做了這樣一個函數,如需要一個數字來產生一個加密號碼,它在Oracle 10中運行良好,但現在它不再適用於ORACLE 11:加密甲骨文

    function crypt (key varchar2, n number) return number 
        raw_input RAW(128); 
        encrypted_raw RAW(2048); 
        raw_key_ RAW(128) := UTL_RAW.CAST_TO_RAW(CONVERT(key,'AL32UTF8','US7ASCII')); 
    begin 
        raw_input_ := UTL_RAW.cast_from_number (n); 
        encrypted_raw := dbms_crypto.Encrypt(src => raw_input_, typ =>DBMS_CRYPTO.DES3_CBC_PKCS5, KEY=>raw_key_); 
        return UTL_RAW.cast_to_number(encrypted_raw); 
    end; 
    

它拋出這個錯誤沒有解釋:

ORA-06502: PL/SQL: numeric or value error 
    ORA-06512: at "SYS.UTL_RAW", line 388 
    ... 

謝謝

回答

1

看起來像你想投的加密原料的數量。如果我明白你想要這個函數做什麼,似乎你想測試輸入數字=返回的數字(你可以加密和解密成功)。如果你想加密,你會返回一個原始數據,而不是數字。

無論如何,您應該將解密的原始值轉換爲數字以測試輸入數字=返回的數字。喜歡的東西:

create or replace function test_crypt(k varchar2, n number) 
return number as 
    raw_input_ RAW(128); 
    encrypted_raw RAW(2000); 
    decrypted_raw  RAW (2000); 
    raw_key_ RAW(128) := UTL_RAW.CAST_TO_RAW(k); 
begin 
    raw_input_ := UTL_RAW.cast_from_number (n); 
    encrypted_raw := dbms_crypto.Encrypt(src => raw_input_, typ =>DBMS_CRYPTO.DES3_CBC_PKCS5, KEY=>raw_key_); 
    --return UTL_RAW.cast_to_number(encrypted_raw); 

    -- use dbms_crypto to decrypt and return (hopefully same) number 
    decrypted_raw := DBMS_CRYPTO.DECRYPT 
     (
     src => encrypted_raw, 
     typ => DBMS_CRYPTO.DES3_CBC_PKCS5, 
     key => raw_key_ 
    ); 

    return UTL_RAW.cast_to_number(decrypted_raw); 
end; 

在我的系統,無論如何,輸入數=返回的數字(關鍵是要從dbms_crypto.randombytes(32))。例如:

select test_crypt('50610FB89D98C7D906CB0A9917413221E4FE6FA62A9604302EE2C8F63E6BAD91', 234.21) from dual; 

輸出:

234.21 
+0

那是沒用的,爲什麼需要隱窩和在同一個函數解密,只是爲了獲得相同數量的?這個功能的目的是什麼?我想要一個加密函數來生成一個加密的數字來存儲和另一個獨立的解密函數,稍後將這個加密的數字存儲在一個數據庫和解密它,以便顯示給用戶 – MihaiS

+0

就像我說的,你不清楚你是什麼試圖去做。如果你想加密一個數字(或字符串或其他),你會返回一個RAW,而不是一個數字。沒有「加密號碼」,不存在這樣的事情。如果你有點禮貌,我可能會花時間將上面的代碼分解成兩個單獨的函數(加密/解密),但它很簡單,我認爲即使你可以處理它。 – tbone

+0

我更新了我的問題,使其更清晰,現在我想獲得一個**號碼**不是原始的... – MihaiS