【问题标题】:Encrypted / Decrypting null using DBMS_crypto使用 DBMS_crypto 加密/解密 null
【发布时间】:2014-03-19 03:09:44
【问题描述】:

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

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

我试过这个:

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。有人可以确认或阐明这一点吗?我真的很难过。

【问题讨论】:

  • clob_substr 函数是如何定义的?
  • 空值保持为空,便于演示。您确定您从空值而不是实际值中得到错误吗?我要查看的两件明显的事情是您的clob_substr 是否按照您期望的顺序获取参数并返回您期望的参数部分;以及解密后的值是否是您期望的格式。试图从 where 子句中找出​​答案将是……棘手的。不过,基本的想法应该可行。
  • 我做了更彻底的分析,在我拥有的测试数据集中,我确实有一些坏数据,其中之前加密的值不是有效数据。它实际上来自“空”与空,不知何故我忽略了那个错误。
  • 但是您确实回答了我的关键问题,即加密空值时会发生什么。你说的保持为空。
  • 真的吗?什么包?我知道 dbms_lob.substr,但不知道“clob_substr”。

标签: oracle encryption null dbms-crypto


【解决方案1】:

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

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() 调用所期望的格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    相关资源
    最近更新 更多