0

我已经在互联网上搜索了当你加密一个空值并解密它时发生的事情。

到目前为止,在我的实验中。在我的表中,我有一列是时间戳。我有几行数据,在这几行中,我混合了适当的时间戳和空值。

我试过这个:

select count(*) from mytable where key = 'currLoginTime' and
  to_timestamp(clob_substr(decrypt(value,?), 19, 1), 'YYYY-MM-DD HH24:MI:SS') > ?

第一个参数是我的私钥,第二个参数是我要比较的日期。

我不断收到以下异常:

ORA-01841: (full) year must be between -4713 and +9999, and not be 0;
nested exception is java.sql.SQLDataException: ORA-01841: (full) year must be
between -4713 and +9999, and not be 0

我猜原来的空值被解密为0。有人可以确认或阐明这一点吗?我真的很难过。

4

1 回答 1

2

加密或解密空值会导致空值。以任何其他方式工作都没有多大意义。展示:

var typ number;
var key varchar2(32);
begin
  :typ := dbms_crypto.encrypt_aes256
     + dbms_crypto.chain_cbc
     + dbms_crypto.pad_pkcs5;
  :key := dbms_crypto.randombytes(32);
end;
/

set null '(null)'

select dbms_crypto.encrypt(src=>utl_i18n.string_to_raw(null, 'AL32UTF8'),
  typ=>:typ, key=>:key) as encrypted
from dual;

ENCRYPTED                    
------------------------------
(null)                         

select utl_i18n.raw_to_char(dbms_crypto.decrypt(src=>null,
  typ=>:typ, key=>:key)) as plain
from dual;

PLAIN                        
------------------------------
(null)                         

您得到的错误不是因为空值。您的至少一个非空值似乎无效 - 加密的原始纯文本值不是您的to_timestamp()调用所期望的格式。

于 2014-03-18T19:09:44.960 回答