Oracle Apex 21.1:如何使用散列密码创建、存储和检索(验证)用户

Posted

技术标签:

【中文标题】Oracle Apex 21.1:如何使用散列密码创建、存储和检索(验证)用户【英文标题】:Oracle Apex 21.1: how to's require for create, store and retrieve (authenticate) users with hashed passwords 【发布时间】:2022-01-06 07:02:42 【问题描述】:

我正在使用 Oracle Apex 21.1 并希望为用户实施散列密码(公共页面,如电子商务网站)。如何在我的 Oracle Apex 应用程序中实现此功能?如果有适合初学者的分步教程,请分享链接。

【问题讨论】:

【参考方案1】:
DECLARE
   input_string       VARCHAR2 (200) :=  'Secret Message';
   output_string      VARCHAR2 (200);
   encrypted_raw      RAW (2000);             -- stores encrypted binary text
   decrypted_raw      RAW (2000);             -- stores decrypted binary text
   num_key_bytes      NUMBER := 256/8;        -- key length 256 bits (32 bytes)
   key_bytes_raw      RAW (32);               -- stores 256-bit encryption key
   encryption_type    PLS_INTEGER :=          -- total encryption type
                            DBMS_CRYPTO.ENCRYPT_AES256
                          + DBMS_CRYPTO.CHAIN_CBC
                          + DBMS_CRYPTO.PAD_PKCS5;
   iv_raw             RAW (16);

BEGIN
   DBMS_OUTPUT.PUT_LINE ( 'Original string: ' || input_string);
   key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
   iv_raw        := DBMS_CRYPTO.RANDOMBYTES (16);
   encrypted_raw := DBMS_CRYPTO.ENCRYPT
      (
         src => UTL_I18N.STRING_TO_RAW (input_string,  'AL32UTF8'),
         typ => encryption_type,
         key => key_bytes_raw,
         iv  => iv_raw
      );
    -- The encrypted value "encrypted_raw" can be used here

   decrypted_raw := DBMS_CRYPTO.DECRYPT
      (
         src => encrypted_raw,
         typ => encryption_type,
         key => key_bytes_raw,
         iv  => iv_raw
      );
   output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
 
   DBMS_OUTPUT.PUT_LINE ('Decrypted string: ' || output_string); 
 
END;

【讨论】:

感谢@Enrique Flores 的回复。我按原样运行代码,但 sqlplus 抛出错误“第 9 行错误:ORA-06550:第 9 行,第 29 列:PLS-00201:标识符 'DBMS_CRYPTO' 必须声明 ORA-06550:第 0 行,第 0 列:PL/SQL : 编译单元分析终止”当前使用的 oracle DB 版本是 21cXE。 好的,它已经安装了,需要从 SYS 授予数据库用户才能访问它。只是一个问题,这些类型的散列密码可以在一段时间后解密吗?我尝试创建一个函数,将其作为 select get_pwd('mywife', 'enc') from dual 访问;它执行并向我显示加密的 mywife,但是当尝试解密该输出时,它显示类似的值而不是“mywife”,我想我失去了 mywife……这不可能吗?或者我错过了什么?请指导。问候

以上是关于Oracle Apex 21.1:如何使用散列密码创建、存储和检索(验证)用户的主要内容,如果未能解决你的问题,请参考以下文章

使用卡片区域下载 BLOB 文件 - Oracle Apex v21.1

如何执行已经存在的 PL/SQL。 (甲骨文 APEX 21.1)

有啥方法可以在不使用 SQL 的情况下获取“选择列表”中显示的文本? (甲骨文 APEX 21.1)

如何使用 APEX 函数编译 Oracle 包?

将传入凭据与 Oracle 散列密码进行比较

如何仅使用 sql 在 apex oracle 的交互式网格中实现选择列表以及 oracle APEX 中可用的内容?