2014-03-25 65 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