---
title: 如何使用 dbms_crypto 系统包来进行加解密的范例-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 如何使用 dbms_crypto 系统包来进行加解密的范例相关的常见问题和使用技巧，帮助您快速解决 如何使用 dbms_crypto 系统包来进行加解密的范例的难题。
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# 如何使用 dbms_crypto 系统包来进行加解密的范例

更新时间：2026-05-09 09:36

适用版本： V4.0.x、V4.1.x、V4.2.x 内容类型：How-to  

OceanBase 数据库中的 `DBMS_CRYPTO` 系统包提供了基本的加密和解密的函数和存储过程。本文主要通过范例介绍如何使用该系统表提供的子程序来进行加密和解密操作。

## 基本语法

```shell
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 概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000822500)。
 - 要加密 VARCHAR2 数据，应首先将其转换为 AL32UTF8 字符集。
 - 要检索原始明文数据，调用 DECRYPT 时，必须使用最初用于加密数据的相同密码、算法、密钥和 IV。
 - 如果 VARCHAR2 数据在加密前转换为原始数据，则必须使用 UTL_I18N 包将其转换回适当的数据库字符集。

## 影响的租户

影响 OceanBase 数据库中的 Oracle 租户有影响，对于 SYS 租户和 MySQL 租户无影响。

## 使用范例

1. 在 Oracle 模式租户下，设置环境变量 serveroutput 为打开状态，使 PL/SQL 程序在 OBClient 客户端中输出结果。

   ```shell
   obclient [SYS]> set serveroutput on;

   ```
 2. 在 Oracle 模式租户下，执行加密和解密存储过程。

   ```shell
   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)

   ```

   输出结果如下：

   ```shell
   Original string: This is My OceanBase Database!
   Encrypted string: 173683FFA0E5D52B878B85ACCBA4B846534B3E706C7F00661C1C0BC0655034B9
   Decrypted string: This is My OceanBase Database!

   ```

## 适用版本

OceanBase 数据库 V4.x 版本。

上一篇

[如何限制用户访问的地址段](https://www.oceanbase.com/knowledge-base/oceanbase-database-20000000119)

下一篇

[Oracle 租户下使用 MySQL 的授权机制](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000297650) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
