### 6.6.4 MySQL企业加密功能说明

MySQL企业加密功能具有以下一般特征：

-   对于错误类型的参数或错误数量的参数，每个函数都会返回一个错误。

-   如果参数不适合允许函数执行请求的操作，它将返回`无效的`或0（视情况而定）。例如，如果函数不支持指定的算法，密钥长度太短或太长，或者预期为PEM格式的密钥字符串的字符串不是有效密钥，就会发生这种情况。（OpenSSL施加了自己的密钥长度限制，服务器管理员可以通过设置环境变量对最大密钥长度施加额外限制。请参阅[第6.6.2节，“MySQL企业加密用法和示例”](enterprise-encryption-usage.html).)

-   底层SSL库负责随机性初始化。

    有几个函数采用加密算法参数。下表按函数总结了支持的算法。

[](<>)

**表6.46按功能列出的支持算法**

| 作用 | 支持的算法 |
| --- | ----- |
| [`非对称_解密（）`](enterprise-encryption-functions.html#function_asymmetric-decrypt) | RSA |
| [`不对称的`](enterprise-encryption-functions.html#function_asymmetric-derive) | DH |
| [`非对称加密`](enterprise-encryption-functions.html#function_asymmetric-encrypt) | RSA |
| [`不对称符号`](enterprise-encryption-functions.html#function_asymmetric-sign) | RSA，DSA |
| [`非对称验证（）`](enterprise-encryption-functions.html#function_asymmetric-verify) | RSA，DSA |
| [`创建非对称私钥（）`](enterprise-encryption-functions.html#function_create-asymmetric-priv-key) | RSA，DSA，DH |
| [`创建非对称发布密钥（）`](enterprise-encryption-functions.html#function_create-asymmetric-pub-key) | RSA，DSA，DH |
| [`创建_dh_参数（）`](enterprise-encryption-functions.html#function_create-dh-parameters) | DH |

笔记

尽管您可以使用任何RSA、DSA或DH加密算法创建密钥，但采用密钥参数的其他函数可能只接受某些类型的密钥。例如[`非对称加密`](enterprise-encryption-functions.html#function_asymmetric-encrypt)和[`非对称_解密（）`](enterprise-encryption-functions.html#function_asymmetric-decrypt)只接受RSA密钥。

下面的描述描述了MySQL企业加密函数的调用序列。有关其他示例和讨论，请参阅[第6.6.2节，“MySQL企业加密用法和示例”](enterprise-encryption-usage.html).

-   [](<>)

    [`非对称解密(*`算法`*, *`crypt\_街`*, *`基尤街`*)`](enterprise-encryption-functions.html#function_asymmetric-decrypt)

    [](<>)

    使用给定的算法和密钥字符串对加密字符串进行解密，并将生成的明文作为二进制字符串返回。如果解密失败，结果是`无效的`.

    *`基尤街`*必须是PEM格式的有效密钥字符串。要成功解密，它必须是与所使用的私钥或公钥字符串相对应的公钥或私钥字符串[`非对称加密`](enterprise-encryption-functions.html#function_asymmetric-encrypt)生成加密字符串。*`算法`*指示用于创建密钥的加密算法。

    支持*`算法`*价值观：`“RSA”`

    有关用法示例，请参见的说明[`非对称加密`](enterprise-encryption-functions.html#function_asymmetric-encrypt).

-   [](<>)

    [`不对称的(*`酒吧街`*, *`priv_key\_街`*)`](enterprise-encryption-functions.html#function_asymmetric-derive)

    [](<>)

    使用一方的私钥和另一方的公钥派生对称密钥，并将生成的密钥作为二进制字符串返回。如果密钥派生失败，结果是`无效的`.

    *`酒吧街`*和*`priv_key_街`*必须是PEM格式的有效密钥字符串。它们必须使用DH算法创建。

    假设您有两对公钥和私钥：

    ```
    SET @dhp = create_dh_parameters(1024);
    SET @priv1 = create_asymmetric_priv_key('DH', @dhp);
    SET @pub1 = create_asymmetric_pub_key('DH', @priv1);
    SET @priv2 = create_asymmetric_priv_key('DH', @dhp);
    SET @pub2 = create_asymmetric_pub_key('DH', @priv2);
    ```

    进一步假设您使用一对密钥中的私钥和另一对密钥中的公钥来创建对称密钥字符串。那么这个对称密钥标识关系就成立了：

    ```
    asymmetric_derive(@pub1, @priv2) = asymmetric_derive(@pub2, @priv1)
    ```

-   [](<>)

    [`非对称加密(*`算法`*, *`str`*, *`基尤街`*)`](enterprise-encryption-functions.html#function_asymmetric-encrypt)

    [](<>)

    使用给定的算法和密钥字符串对字符串进行加密，并将生成的密文作为二进制字符串返回。如果加密失败，结果是`无效的`.

    这个*`str`*长度不能大于*`基尤街`*长− 11，以字节为单位

    *`基尤街`*必须是PEM格式的有效密钥字符串。*`算法`*指示用于创建密钥的加密算法。

    支持*`算法`*价值观：`“RSA”`

    要加密字符串，请将私钥或公钥字符串传递给[`非对称加密`](enterprise-encryption-functions.html#function_asymmetric-encrypt).要恢复原始未加密字符串，请将加密字符串传递给[`非对称_解密（）`](enterprise-encryption-functions.html#function_asymmetric-decrypt)，以及与用于加密的私钥或公钥字符串对应的公钥或私钥字符串。

    ```
    -- Generate private/public key pair
    SET @priv = create_asymmetric_priv_key('RSA', 1024);
    SET @pub = create_asymmetric_pub_key('RSA', @priv);

    -- Encrypt using private key, decrypt using public key
    SET @ciphertext = asymmetric_encrypt('RSA', 'The quick brown fox', @priv);
    SET @plaintext = asymmetric_decrypt('RSA', @ciphertext, @pub);

    -- Encrypt using public key, decrypt using private key
    SET @ciphertext = asymmetric_encrypt('RSA', 'The quick brown fox', @pub);
    SET @plaintext = asymmetric_decrypt('RSA', @ciphertext, @priv);
    ```

    假设：

    ```
    SET @s = a string to be encrypted
    SET @priv = a valid private RSA key string in PEM format
    SET @pub = the corresponding public RSA key string in PEM format
    ```

    那么这些身份关系就成立了：

    ```
    asymmetric_decrypt('RSA', asymmetric_encrypt('RSA', @s, @priv), @pub) = @s
    asymmetric_decrypt('RSA', asymmetric_encrypt('RSA', @s, @pub), @priv) = @s
    ```

-   [](<>)

    [`不对称_征(*`算法`*, *`迪斯科街`*, *`priv_key\_街`*, *`消化型`*)`](enterprise-encryption-functions.html#function_asymmetric-sign)

    [](<>)

    使用私钥字符串对摘要字符串进行签名，并将签名作为二进制字符串返回。如果签名失败，结果是`无效的`.

    *`迪斯科街`*是摘要字符串。它可以通过调用[`创建_摘要（）`](enterprise-encryption-functions.html#function_create-digest). *`消化型`*指示用于生成摘要字符串的摘要算法。

    *`priv_key_街`*用于签名摘要字符串的私钥字符串。它必须是PEM格式的有效密钥字符串。*`算法`*指示用于创建密钥的加密算法。

    支持*`算法`*价值观：`“RSA”`, `“DSA”`

    支持*`消化型`*价值观：`“SHA224”`, `“SHA256”`, `“SHA384”`, `“SHA512”`

    有关用法示例，请参见的说明[`非对称验证（）`](enterprise-encryption-functions.html#function_asymmetric-verify).

-   [](<>)

    [`不对称检验(*`算法`*, *`迪斯科街`*, *`西古街`*, *`酒吧街`*, *`消化型`*)`](enterprise-encryption-functions.html#function_asymmetric-verify)

    [](<>)

    验证签名字符串是否与摘要字符串匹配，并返回1或0以指示验证是否成功。

    *`迪斯科街`*是摘要字符串。它可以通过调用[`创建_摘要（）`](enterprise-encryption-functions.html#function_create-digest). *`消化型`*指示用于生成摘要字符串的摘要算法。

    *`西古街`*是签名字符串。它可以通过调用[`不对称符号`](enterprise-encryption-functions.html#function_asymmetric-sign).

    *`酒吧街`*是签名者的公钥字符串。它对应于传递给的私钥[`不对称符号`](enterprise-encryption-functions.html#function_asymmetric-sign)要生成签名字符串，必须是PEM格式的有效密钥字符串。*`算法`*指示用于创建密钥的加密算法。

    支持*`算法`*价值观：`“RSA”`, `“DSA”`

    支持*`消化型`*价值观：`“SHA224”`, `“SHA256”`, `“SHA384”`, `“SHA512”`

    ```
    -- Set the encryption algorithm and digest type
    SET @algo = 'RSA';
    SET @dig_type = 'SHA224';

    -- Create private/public key pair
    SET @priv = create_asymmetric_priv_key(@algo, 1024);
    SET @pub = create_asymmetric_pub_key(@algo, @priv);

    -- Generate digest from string
    SET @dig = create_digest(@dig_type, 'The quick brown fox');

    -- Generate signature for digest and verify signature against digest
    SET @sig = asymmetric_sign(@algo, @dig, @priv, @dig_type);
    SET @verf = asymmetric_verify(@algo, @dig, @sig, @pub, @dig_type);
    ```

-   [](<>)

    [`创建私钥(*`算法`*, {*`基伦`*|*`dh\_秘密`*})`](enterprise-encryption-functions.html#function_create-asymmetric-priv-key)

    [](<>)

    使用给定的算法和密钥长度或DH secret创建私钥，并以PEM格式的二进制字符串形式返回密钥。如果密钥生成失败，结果是`无效的`.

    支持*`算法`*价值观：`“RSA”`, `“DSA”`, `“DH”`

    支持*`基伦`*值：以位为单位的最小密钥长度为1024。最大密钥长度取决于算法：RSA为16384，DSA为10000。这些密钥长度限制是OpenSSL施加的限制。服务器管理员可以通过设置环境变量对最大密钥长度施加额外限制。看见[第6.6.2节，“MySQL企业加密用法和示例”](enterprise-encryption-usage.html).

    对于DH密钥，传递共享DH密钥，而不是密钥长度。要创建秘密，请将密钥长度传递给[`创建_dh_参数（）`](enterprise-encryption-functions.html#function_create-dh-parameters).

    本例创建2048位DSA私钥，然后从私钥中导出公钥：

    ```
    SET @priv = create_asymmetric_priv_key('DSA', 2048);
    SET @pub = create_asymmetric_pub_key('DSA', @priv);
    ```

    有关显示DH密钥生成的示例，请参见[`不对称的`](enterprise-encryption-functions.html#function_asymmetric-derive).

    选择密钥长度和加密算法时的一些一般注意事项：

    -   私钥和公钥的加密强度随着密钥大小的增加而增加，但密钥生成的时间也会增加。

    -   DH密钥的生成比RSA或RSA密钥需要更长的时间。

    -   非对称加密函数比对称函数慢。如果性能是一个重要因素，并且函数需要经常使用，那么最好使用对称加密。例如，考虑使用[`AES_ENCRYPT（）`](encryption-functions.html#function_aes-encrypt)和[`AES_DECRYPT（）`](encryption-functions.html#function_aes-decrypt).

-   [](<>)

    [`创建非对称发布密钥(*`算法`*, *`priv_key\_街`*)`](enterprise-encryption-functions.html#function_create-asymmetric-pub-key)

    [](<>)

    使用给定的算法从给定的私钥派生公钥，并以PEM格式的二进制字符串形式返回密钥。如果密钥派生失败，结果是`无效的`.

    *`priv_key_街`*必须是PEM格式的有效密钥字符串。*`算法`*指示用于创建密钥的加密算法。

    支持*`算法`*价值观：`“RSA”`, `“DSA”`, `“DH”`

    有关用法示例，请参见的说明[`创建非对称私钥（）`](enterprise-encryption-functions.html#function_create-asymmetric-priv-key).

-   [](<>)

    [`创建_dh_参数(*`基伦`*)`](enterprise-encryption-functions.html#function_create-dh-parameters)

    [](<>)

    创建用于生成DH私钥/公钥对的共享密钥，并返回可传递给的二进制字符串[`创建非对称私钥（）`](enterprise-encryption-functions.html#function_create-asymmetric-priv-key).如果秘密生成失败，则结果为空。

    支持*`基伦`*值：以位为单位的最小和最大密钥长度分别为1024和10000。这些密钥长度限制是OpenSSL施加的限制。服务器管理员可以通过设置环境变量对最大密钥长度施加额外限制。看见[第6.6.2节，“MySQL企业加密用法和示例”](enterprise-encryption-usage.html).

    有关如何使用返回值生成对称密钥的示例，请参见的说明[`不对称的`](enterprise-encryption-functions.html#function_asymmetric-derive).

    ```
    SET @dhp = create_dh_parameters(1024);
    ```

-   [](<>)

    [`创建_摘要(*`消化型`*, *`str`*)`](enterprise-encryption-functions.html#function_create-digest)

    [](<>)

    使用给定的摘要类型从给定字符串创建摘要，并将摘要作为二进制字符串返回。如果摘要生成失败，结果是`无效的`.

    支持*`消化型`*价值观：`“SHA224”`, `“SHA256”`, `“SHA384”`, `“SHA512”`

    ```
    SET @dig = create_digest('SHA512', 'The quick brown fox');
    ```

    生成的摘要字符串适合用于[`不对称符号`](enterprise-encryption-functions.html#function_asymmetric-sign)和[`非对称验证（）`](enterprise-encryption-functions.html#function_asymmetric-verify).
