#### 5.6.9.2 密钥环服务

[](<>)[](<>)

MySQL 服务器支持密钥环服务，使内部组件和插件能够安全地存储敏感信息以供以后检索。MySQL 发行版提供了一个可在两个级别访问的密钥环接口：

-   在 SQL 级别，作为一组可加载函数，每个函数都映射到对服务例程的调用。

-   作为 C 语言接口，可作为插件服务从服务器插件或可加载函数调用。

    本节介绍如何使用密钥环服务功能来存储、检索和删除 MySQL 密钥环密钥库中的密钥。有关使用函数的 SQL 接口的信息，[第 6.4.4.14 节，“通用密钥环密钥管理功能”](keyring-functions-general-purpose.html).有关一般密钥环信息，请参阅[第 6.4.4 节，“MySQL 密钥环”](keyring.html).

    密钥环服务使用启用的任何底层密钥环插件（如果有）。如果未启用密钥环插件，则密钥环服务调用失败。

    密钥库中的“记录”由数据（密钥本身）和访问密钥的唯一标识符组成。标识符有两部分：

-   `key_id`：密钥 ID 或名称。`key_id`开头的值`mysql_`由 MySQL 服务器保留。

-   `用户身份`：会话有效用户ID。如果没有用户上下文，这个值可以是`空值`.该值实际上不必是“用户”；含义取决于应用程序。

    实现keyring函数接口的函数传递的值[`当前用户（）`](information-functions.html#function_current-user)作为`用户身份`密钥环服务功能的价值。

    密钥环服务功能具有以下共同特征：

-   每个函数返回 0 表示成功，1 表示失败。

-   这`key_id`和`用户身份`参数形成一个唯一的组合，指示要使用密钥环中的哪个密钥。

-   这`键类型`参数提供有关密钥的附加信息，例如其加密方法或预期用途。

-   密钥环服务函数将密钥 ID、用户名、类型和值视为二进制字符串，因此比较区分大小写。例如，ID`我的钥匙`和`我的钥匙`指不同的键。

    这些密钥环服务功能可用：

-   `my_key_fetch()`

    [](<>)[](<>)

    反混淆并从密钥环中检索密钥及其类型。该函数为用于存储返回的键和键类型的缓冲区分配内存。当不再需要内存时，调用者应将其归零或混淆，然后释放它。

    句法：

    ```
    bool my_key_fetch(const char *key_id, const char **key_type,
                      const char* user_id, void **key, size_t *key_len)
    ```

    论据：

    -   `key_id`,`用户身份`: 以空字符结尾的字符串，它们成对形成一个唯一标识符，指示要获取的密钥。

    -   `键类型`：缓冲区指针的地址。该函数在其中存储一个指向以空字符结尾的字符串的指针，该字符串提供有关密钥的附加信息（在添加密钥时存储）。

    -   `钥匙`：缓冲区指针的地址。该函数在其中存储一个指向缓冲区的指针，该缓冲区包含获取的关键数据。

    -   `key_len`: 变量的地址，函数将大小存储到该变量中，以字节为单位`*钥匙`缓冲。

        返回值：

        返回 0 表示成功，1 表示失败。

-   `my_key_generate()`

    [](<>)[](<>)

    生成给定类型和长度的新随机密钥并将其存储在密钥环中。密钥的长度为`key_len`并且与由以下组成的标识符相关联`key_id`和`用户身份`.类型和长度值必须与底层密钥环插件支持的值一致。看[第 6.4.4.12 节，“支持的密钥环密钥类型和长度”](keyring-key-types.html).

    句法：

    ```
    bool my_key_generate(const char *key_id, const char *key_type,
                         const char *user_id, size_t key_len)
    ```

    论据：

    -   `key_id`,`用户身份`: 以空字符结尾的字符串，它们作为一对形成要生成的密钥的唯一标识符。

    -   `键类型`：一个以 null 结尾的字符串，提供有关密钥的附加信息。

    -   `key_len`：要生成的密钥的大小（以字节为单位）。

        返回值：

        返回 0 表示成功，1 表示失败。

-   `my_key_remove()`

    [](<>)[](<>)

    从密钥环中删除密钥。

    句法：

    ```
    bool my_key_remove(const char *key_id, const char* user_id)
    ```

    论据：

    -   `key_id`, `用户身份`: 以空字符结尾的字符串，它们作为一对形成要删除的键的唯一标识符。

        返回值：

        返回 0 表示成功，1 表示失败。

-   `my_key_store()`

    [](<>)[](<>)

    混淆密钥并将密钥存储在密钥环中。

    句法：

    ```
    bool my_key_store(const char *key_id, const char *key_type,
                      const char* user_id, void *key, size_t key_len)
    ```

    论据：

    -   `key_id`, `用户身份`: 以空字符结尾的字符串，它们作为一对形成要存储的密钥的唯一标识符。

    -   `键类型`：一个以 null 结尾的字符串，提供有关密钥的附加信息。

    -   `钥匙`：包含要存储的关键数据的缓冲区。

    -   `key_len`: 以字节为单位的大小`钥匙`缓冲。

        返回值：

        返回 0 表示成功，1 表示失败。
