Зашифрованный / дешифрующий нуль с использованием DBMS_crypto
Я искал по всему интернету, что произошло, когда вы шифровали нулевое значение и расшифровывали его.
Пока что в моем эксперименте. В моей таблице есть столбец, который является меткой времени. У меня есть несколько строк данных, в этих нескольких строках у меня есть правильная временная метка и нулевое значение.
Я попытался это:
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. Может кто-то подтвердить или пролить некоторый свет на это? Я действительно в тупик.
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()
звонок ожидается.