oracle中DBMS_CRYPTO.encrypt函数的使用方法

How to use DBMS_CRYPTO.encrypt function in oracle

我想加密数据库中的密码列,我正在尝试使用 DBMS_CRYPTO 包中的加密函数(已将 sys 帐户的执行权限授予当前用户),但出现以下错误. 请给我一些如何使用此功能的示例:

select DBMS_CRYPTO.encrypt('12345', dbms_crypto.DES_CBC_PKCS5, 'A1') from dual;

错误:

ORA-06553: PLS-221: 'DES_CBC_PKCS5' is not a procedure or is undefined 06553. 00000 - "PLS-%s: %s"

常量 dbms_crypto.DES_CBC_PKCS5 仅在 PL/SQL 上引用 - 而不是来自 SQL.

您必须在 SELECT 语句中将其替换为文字值。

要获取值,请使用 PL/SQL 块

 begin
   dbms_output.put_line(dbms_crypto.DES_CBC_PKCS5);
 end;
 /

.

 4353

您还必须使用更长的密钥

 select DBMS_CRYPTO.encrypt(UTL_RAW.CAST_TO_RAW ('ABCDEFGH12345'), 4353 /* = dbms_crypto.DES_CBC_PKCS5 */, 'A1A2A3A4A5A6CAFE') from dual;

 9320CBCBD25E8721BD04990A0EAEAF00

上面的回答很好,我只是添加了一些关于 4353 的信息。我看到这个请求是按原样使用的,我注意到这个值并不真正被理解。

4353 是关于使用的加密(des、aes 等)三个信息的加法块密码操作模式(ecb 或cbc)和填充模式

所以,4353代表1(des)+cbc模式(256)+pkcs5 padding(4096)

如果你喜欢aes 256,你必须使用4356

4358代表aes 128

等等。

描述不同参数的 Oracle 页面是 here

希望这些额外的信息可以帮助大家更好地理解DBMS_CRYPTO.

加密

select DBMS_CRYPTO.encrypt(UTL_RAW.CAST_TO_RAW('ABCDEFGH12345'), 4353 /* = dbms_crypto.DES_CBC_PKCS5 */, UTL_RAW.CAST_TO_RAW ('A1A2A3A4A5A6CAFE')) from dual;

解密

select UTL_RAW.CAST_TO_varchar2(DBMS_CRYPTO.decrypt('80AA4DEA59B77C433A2142AE9CDD235A', 4353, UTL_RAW.CAST_TO_RAW ('A1A2A3A4A5A6CAFE'))) from dual;