概述
在 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