安全使用 DBMS_CRYPTO.ENCRYPT - 检测到 NLS 错误

Using DBMS_CRYPTO.ENCRYPT safely - NLS error detected

我正在尝试使用 DBMS_CRYPTO 加密,但无论我如何选择某些参数,我都会遇到代码抛出的值

ORA-01890: NLS error detected ORA-06512: at "SYS.UTL_I18N", line 72 ORA-06512: at "SYS.UTL_I18N", line 353 ORA-06512: at line 26

这是一个例子

declare
-- v_value             VARCHAR2 (4000) := '9Ab2Ov1Bd4'; --  works
-- v_value             VARCHAR2 (4000) := '7Md4Mt7Gk0'; --  works
-- v_value             VARCHAR2 (4000) := '3Vf8Fi2Pa5'; --  works
-- v_value VARCHAR2(4000) := '5Vq2Dc4Cq9'; -- works as well
v_value VARCHAR2(4000) := '2Cq0Yh3Vb2'; --this does not work?
v_result            VARCHAR2 (4000);
v_raw_row           RAW (2000);                 -- stores ec binary text

v_enc_type          PLS_INTEGER
         :=                        
     DBMS_CRYPTO.ENCRYPT_AES256 +  
     DBMS_CRYPTO.CHAIN_CBC +
     DBMS_CRYPTO.PAD_ZERO;                   -- total encryption type

v_def_k             VARCHAR2 (32) := 'mMbSmSMr_!_uAlns9asG5_a_AfhS4_3a';
begin
 v_raw_row :=
            DBMS_CRYPTO.ENCRYPT (
               src   => UTL_I18N.STRING_TO_RAW (v_value, 'AL32UTF8'),
               typ   => v_enc_type,
               key   => UTL_RAW.CAST_TO_RAW (v_def_k));
v_result := UTL_I18N.RAW_TO_CHAR (v_raw_row, 'AL32UTF8');
dbms_output.put_line(v_result);
end;

更改加密类型和密钥“解决”了一个不起作用的值的问题,但我总是遇到另一个值,然后会抛出这个确切的异常。

我在 Oracle 12.2.0.1.0 和 19.0.0.0.0 中都试过了。完全相同的行为。

我想我正在做的事情是完全错误的。感谢任何帮助。

请尝试使用 WE8ISO8859P1 或 null,而不是 AL32UTF8 作为源字符集。

来自 Oracle 文档:

UTL_I18N.RAW_TO_CHAR是一个函数,可以实现raw到char数据类型的转换,但不能实现不同字符集的转换。 第二个参数要指定原始数据传递给哪个字符集,即源字符集。

指定 RAW 数据的来源字符集。如果 src_charset 为 NULL,则使用数据库字符集。

所以如果使用DB字符集或NULL,则不会报错