安全使用 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,则不会报错
我正在尝试使用 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,则不会报错