MySQL Enterprise Encryption 函数具有以下一般特征:
- 对于错误类型的参数或不正确数量的参数,每个函数都会返回一个错误。
- 如果参数不适合允许函数执行请求的操作,则返回
NULL或 0 视情况而定。例如,如果函数不支持指定的算法、密钥长度太短或太长,或者预期作为 PEM 格式的密钥字符串的字符串不是有效密钥,则会发生这种情况。(OpenSSL 施加了自己的密钥长度限制,服务器管理员可以通过设置环境变量对最大密钥长度施加额外限制。请参阅 第 6.6.2 节,“MySQL 企业加密用法和示例”。) - 底层 SSL 库负责随机初始化。
几个函数采用加密算法参数。下表按功能总结了支持的算法。
表 6.42 功能支持的算法
| 功能 | 支持的算法 |
|---|---|
asymmetric_decrypt() |
RSA |
asymmetric_derive() |
卫生署 |
asymmetric_encrypt() |
RSA |
asymmetric_sign() |
RSA、DSA |
asymmetric_verify() |
RSA、DSA |
create_asymmetric_priv_key() |
RSA、DSA、DH |
create_asymmetric_pub_key() |
RSA、DSA、DH |
create_dh_parameters() |
卫生署 |
笔记
尽管您可以使用任何 RSA、DSA 或 DH 加密算法创建密钥,但其他采用密钥参数的函数可能只接受某些类型的密钥。例如, asymmetric_encrypt()并且 asymmetric_decrypt()只接受RSA密钥。
以下描述描述了 MySQL Enterprise Encryption 函数的调用顺序。有关其他示例和讨论,请参阅 第 6.6.2 节,“MySQL 企业加密用法和示例”。
asymmetric_decrypt(*algorithm*, *crypt_str*, *key_str*)
使用给定的算法和密钥字符串解密加密字符串,并将结果明文作为二进制字符串返回。如果解密失败,则结果为 NULL。
key_str必须是 PEM 格式的有效密钥字符串。为了成功解密,它必须是与asymmetric_encrypt()用于生成加密字符串的私钥或公钥字符串相对应的公钥或私钥 字符串。algorithm 表示用于创建密钥的加密算法。
支持的*algorithm*值: 'RSA'
有关使用示例,请参阅 的说明 asymmetric_encrypt()。
asymmetric_derive(*pub_key_str*, *priv_key_str*)
使用一方的私钥和另一方的公钥派生对称密钥,并将结果密钥作为二进制字符串返回。如果密钥派生失败,则结果为 NULL。
*pub_key_str*并且 *priv_key_str*必须是 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)
asymmetric_encrypt(*algorithm*, *str*, *key_str*)
使用给定的算法和密钥字符串加密字符串,并以二进制字符串的形式返回生成的密文。如果加密失败,结果是NULL。
的*str长度不能大于key_str*长度- 11,以字节为单位
*key_str必须是 PEM 格式的有效密钥字符串。algorithm*表示用于创建密钥的加密算法。
支持的*algorithm*值: 'RSA'
要加密字符串,请将私钥或公钥字符串传递给 asymmetric_encrypt(). 要恢复原始未加密字符串,请将加密字符串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
asymmetric_sign(*algorithm*, *digest_str*, *priv_key_str*, *digest_type*)
使用私钥字符串对摘要字符串进行签名,并将签名作为二进制字符串返回。如果签名失败,则结果为NULL。
*digest_str*是摘要字符串。它可以通过调用生成 create_digest()。 *digest_type*表示用于生成摘要字符串的摘要算法。
*priv_key_str*是用于签署摘要字符串的私钥字符串。它必须是 PEM 格式的有效密钥字符串。 *algorithm*表示用于创建密钥的加密算法。
支持的*algorithm*值: 'RSA','DSA'
支持的*digest_type*值: 'SHA224', 'SHA256', 'SHA384','SHA512'
有关使用示例,请参阅 的说明 asymmetric_verify()。
asymmetric_verify(*algorithm*, *digest_str*, *sig_str*, *pub_key_str*, *digest_type*)
验证签名字符串是否与摘要字符串匹配,返回 1 或 0 表示验证成功或失败。
*digest_str*是摘要字符串。它可以通过调用生成 create_digest()。 *digest_type*表示用于生成摘要字符串的摘要算法。
*sig_str*是签名字符串。它可以通过调用生成 asymmetric_sign()。
*pub_key_str是签名者的公钥字符串。它对应于传递给asymmetric_sign()生成签名字符串的私钥,并且必须是 PEM 格式的有效密钥字符串。algorithm*表示用于创建密钥的加密算法。
支持的*algorithm*值: 'RSA','DSA'
支持的*digest_type*值: '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);
create_asymmetric_priv_key(*algorithm*, {*key_len*|*dh_secret*})
使用给定的算法和密钥长度或 DH 秘密创建私钥,并将密钥作为 PEM 格式的二进制字符串返回。如果密钥生成失败,则结果为 NULL。
支持的*algorithm*值: 'RSA', 'DSA', 'DH'
支持的*key_len*值:以位为单位的最小密钥长度为 1,024。最大密钥长度取决于算法:RSA 为 16,384,DSA 为 10,000。这些密钥长度限制是 OpenSSL 强加的约束。服务器管理员可以通过设置环境变量对最大密钥长度施加额外限制。请参阅 第 6.6.2 节,“MySQL 企业加密用法和示例”。
对于 DH 密钥,传递共享 DH 秘密而不是密钥长度。要创建密钥,请将密钥长度传递给 create_dh_parameters()。
此示例创建一个 2,048 位 DSA 私钥,然后从私钥派生出一个公钥:
SET @priv = create_asymmetric_priv_key('DSA', 2048);
SET @pub = create_asymmetric_pub_key('DSA', @priv);
有关显示 DH 密钥生成的示例,请参阅 的说明asymmetric_derive()。
选择密钥长度和加密算法时的一些一般考虑:
-
私钥和公钥的加密强度随着密钥大小的增加而增加,但密钥生成的时间也会增加。
-
DH 密钥的生成时间比 RSA 或 RSA 密钥长得多。
-
非对称加密函数比对称函数慢。如果性能是一个重要因素,并且函数需要非常频繁地使用,那么最好使用对称加密。例如,考虑使用
AES_ENCRYPT()和AES_DECRYPT()。
create_asymmetric_pub_key(*algorithm*, *priv_key_str*)
使用给定的算法从给定的私钥派生出一个公钥,并以 PEM 格式的二进制字符串形式返回密钥。如果密钥派生失败,则结果为 NULL。
priv_key_str必须是 PEM 格式的有效密钥字符串。algorithm 表示用于创建密钥的加密算法。
支持的*algorithm*值: 'RSA', 'DSA', 'DH'
有关使用示例,请参阅 的说明 create_asymmetric_priv_key()。
create_dh_parameters(*key_len*)
创建用于生成 DH 私钥/公钥对的共享密钥,并返回可以传递给 的二进制字符串 create_asymmetric_priv_key()。如果秘密生成失败,则结果为空。
支持的*key_len*值:以位为单位的最小和最大密钥长度为 1,024 和 10,000。这些密钥长度限制是 OpenSSL 强加的约束。服务器管理员可以通过设置环境变量对最大密钥长度施加额外限制。请参阅 第 6.6.2 节,“MySQL 企业加密用法和示例”。
有关显示如何使用返回值生成对称密钥的示例,请参阅 的说明 asymmetric_derive()。
SET @dhp = create_dh_parameters(1024);
create_digest(*digest_type*, *str*)
使用给定的摘要类型从给定的字符串创建摘要,并将摘要作为二进制字符串返回。如果摘要生成失败,则结果为NULL。
支持的*digest_type*值: 'SHA224', 'SHA256', 'SHA384','SHA512'
SET @dig = create_digest('SHA512', 'The quick brown fox');
生成的摘要字符串适合与asymmetric_sign()和 一起使用 asymmetric_verify()。




