首批通过分布式安全可靠测评,为关键业务系统打造
如何使用 dbms_crypto 系统包来进行加解密的范例
更新时间:2026-05-09 09:36
OceanBase 数据库中的 DBMS_CRYPTO 系统包提供了基本的加密和解密的函数和存储过程。本文主要通过范例介绍如何使用该系统表提供的子程序来进行加密和解密操作。
基本语法
DBMS_CRYPTO.ENCRYPT(
src IN RAW,
typ IN PLS_INTEGER,
key IN RAW,
iv IN RAW DEFAULT NULL)
RETURN RAW;
DBMS_CRYPTO.DECRYPT(
src IN RAW,
typ IN PLS_INTEGER,
key IN RAW,
iv IN RAW DEFAULT NULL)
RETURN RAW;
参数解释
| 参数 | 解释 |
|---|---|
| src | 要加密或解密的 RAW 数据。 |
| typ | 所使用的密码流和密码块链接算法。 |
| key | 用于加密的密钥。 |
| iv | 密码块的可选初始化向量。默认值为 NULL。 |
使用说明
密码块可以使用链接和填充算法进行修改。链接和填充算法被添加到密码块中,以生成密码组合。密码块链接(CBC)是最常用的链接类型。关于此系统包所支持的密码块链接和填充算法,相关详细内容请参见:DBMS_CRYPTO 概述。
要加密 VARCHAR2 数据,应首先将其转换为 AL32UTF8 字符集。
要检索原始明文数据,调用 DECRYPT 时,必须使用最初用于加密数据的相同密码、算法、密钥和 IV。
如果 VARCHAR2 数据在加密前转换为原始数据,则必须使用 UTL_I18N 包将其转换回适当的数据库字符集。
影响的租户
影响 OceanBase 数据库中的 Oracle 租户有影响,对于 SYS 租户和 MySQL 租户无影响。
使用范例
在 Oracle 模式租户下,设置环境变量 serveroutput 为打开状态,使 PL/SQL 程序在 OBClient 客户端中输出结果。
obclient [SYS]> set serveroutput on;在 Oracle 模式租户下,执行加密和解密存储过程。
obclient [SYS]> DECLARE input_string VARCHAR2 (200) := 'This is My OceanBase Database!'; 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 := utl_raw.cast_to_raw(randstr(num_key_bytes, random())); iv_raw := utl_raw.cast_to_raw(randstr(16, random())); 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 DBMS_OUTPUT.PUT_LINE('Encrypted string: ' || encrypted_raw); 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; / Query OK, 1 row affected (0.040 sec)输出结果如下:
Original string: This is My OceanBase Database! Encrypted string: 173683FFA0E5D52B878B85ACCBA4B846534B3E706C7F00661C1C0BC0655034B9 Decrypted string: This is My OceanBase Database!
适用版本
OceanBase 数据库 V4.x 版本。