概述

在 Oracle 数据库中进行加密的方法有很多种。
其中,一个名为 DBMS_CRYPTO 的包是免费提供的。

在我尝试使用的时候,发现使用起来相当麻烦,所以在本文中,我将介绍使DBMS_CRYPTO更易于使用的功能代码。

加解密使用图

DBMS_CRYPTO是可以加解密的,不知道是不是可以这样做?我是这么想的,但显然不是。

 以下は動作しません
insert into employee_card(id,cardnumber) values (100001, DBMS_CRYPTO.ENCRYPT('123456789012'));
select id from employee_card where cardnumber = DBMS_CRYPTO.ENCRYPT('123456789012');
select DBMS_CRYPTO.DECRYPT(cardnumber) from employee_card where id = 100001;

实际上,我似乎必须做一些相当麻烦的事情。
但是,为每个加密应用程序实现它是超级麻烦的。 .

那么为什么不创建一个像上面那样工作的函数呢?我想,并创建了 DBUP_CRYPTO。

先决条件

经 Oracle 数据库 19.15.0 验证。
此外,选择了以下加密算法。

设定项目 设置 命令
加密演算法 AES 128 位 加密_AES128
分组密码链 密码块链 CHAIN_CBC
分组密码填充 PKCS#5 PAD_PKCS5
初始化向量 无效的 无效的

有关这方面的更多信息,请参阅下面的官方手册。
PL/SQL 包和类型参考 - 42 DBMS_CRYPTO

另外,我觉得将加密密钥信息存储在DB中会更安全,所以我创建了一个enc用户,在那里创建了一个名为enctab的表,并存储在其中。

提前准备

由于需要提前制作密钥,请执行以下操作

  • 创建一个具有管理员权限的enc用户,创建一个表来保存键值,并输入键值
SQL> create user enc identified by ***** quota unlimited on users;
SQL> create table enc.enctab (enckey char(16));
SQL> insert into enc.enctab values ('1234567890123456');
SQL> commit;
  • 将 DBMS_CRYPTO 的执行权限授予 enc 用户
SQL> grant execute on dbms_crypto to enc;
  • 以具有管理员权限的用户身份安装软件包
SQL> @dbup_crypto.sql
  • 向具有加密包的用户授予已安装功能的权限
SQL> grant execute on enc.dbup_crypto to パッケージユーザー;

dbup_crypto.sql 的代码

create or replace package ENC.DBUP_CRYPTO 
as
  function encrypt (char_for_encryption in varchar2) return raw;
  function decrypt (char_for_decryption in raw) return varchar2;
  function readenqval return varchar2;
end;
/

create or replace package body ENC.DBUP_CRYPTO
is
    function readenqval return varchar2
    is
        v_data  varchar2(100);
    begin
        select enckey into v_data from ENC.ENCTAB where rownum < 2;
        return v_data;
    end readenqval;

    function encrypt (char_for_encryption in varchar2) return raw
    is
        v_myKey     varchar2(16);
        v_enctype   number := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
        v_keyval    raw(16);
        v_encval    raw(2000);
    begin
        v_myKey := dbup_crypto.readenqval;
        v_keyval := UTL_I18N.STRING_TO_RAW(v_myKey, 'AL32UTF8');
        v_encval := UTL_I18N.STRING_TO_RAW(char_for_encryption, 'AL32UTF8');
        return dbms_crypto.encrypt(src => v_encval, typ => v_enctype, key => v_keyval, iv => null);
    end encrypt;

    function decrypt (char_for_decryption in raw) return varchar2
    is 
        v_myKey     varchar2(16);
        v_enctype   number := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
        v_keyval    raw(16);
    begin
        v_myKey := dbup_crypto.readenqval;
        v_keyval :=  UTL_I18N.STRING_TO_RAW(v_myKey, 'AL32UTF8');
        return UTL_I18N.RAW_TO_CHAR(dbms_crypto.decrypt(src => char_for_decryption, typ => v_enctype, key => v_keyval, iv => null), 'AL32UTF8');
    end decrypt;

    end;
/

DBUP_CRYPTO 的使用示例

首先,创建一个表来存储加密数据

SQL> create table employee_card (id number, cardnumber raw(100));

Table created.

接下来对数据123456789012进行加密,放入表中

SQL> insert into employee_card values (100001, enc.DBUP_CRYPTO.ENCRYPT('123456789012'));

1 row created.

SQL> select * from employee_card;

        ID CARDNUMBER
---------- -----------------------------------
    100001 7E9634826EE8B79227B43C8B6A29AE17 ★暗号化されている

以加密状态存储在表中!

检查是否可以使用加密数据作为密钥进行搜索。

SQL> select id from employee_card where cardnumber = enc.DBUP_CRYPTO.ENCRYPT('123456789012');

        ID
----------
    100001

我能够搜索!

检查是否可以选择解密的数据

SQL> select enc.DBUP_CRYPTO.DECRYPT(cardnumber) from employee_card where id = 100001;

ENC.DBUP_CRYPTO.DECRYPT(CARDNUMBER)
-------------------------------------
123456789012 ★暗号化する前の情報が確認できる

我能够确认它可以正确解密!

#结果
我认为 dbms_crypto 不好用,但通过使用更易于使用的功能,我能够在开发中取得进展。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308633019.html

相关文章: