12.19.4 MySQL 企业加密功能说明

MySQL 企业加密功能具有以下一般 Feature:

  • 对于类型错误或参数数量错误的参数,每个函数都会返回错误。

  • 如果参数不适合允许函数执行所请求的操作,则将根据情况返回NULL或 0.例如,如果某个函数不支持指定的算法,密钥长度太短或太长,或者预期是 PEM 格式的密钥字符串的字符串不是有效密钥,就会发生这种情况。 (OpenSSL 施加了自己的密钥长度限制,服务器 Management 员可以通过设置环境变量来对最大密钥长度施加其他限制.请参阅第 12.19.2 节“ MySQL 企业加密的用法和示例”。)

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

其中一些函数采用加密算法参数。下 table 按功能总结了受支持的算法。

table12.25 按功能支持的算法

FunctionSupported Algorithms
ASYMMETRIC_DECRYPT()RSA
ASYMMETRIC_DERIVE()DH
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()DH

Note

尽管您可以使用 RSA,DSA 或 DH 加密算法中的任何一种来创建密钥,但是带有密钥参数的其他函数可能只接受某些类型的密钥。例如,ASYMMETRIC_ENCRYPT()ASYMMETRIC_DECRYPT()仅接受 RSA 密钥。

以下描述描述了 MySQL 企业加密函数的调用 Sequences。有关其他示例和讨论,请参见第 12.19.2 节“ MySQL 企业加密的用法和示例”

ASYMMETRIC_DECRYPT(算法,crypt_str,key_str)

使用给定的算法和密钥字符串解密加密的字符串,并以二进制字符串的形式返回结果纯文本。如果解密失败,则结果为NULL

  • key_str *必须是 PEM 格式的有效密钥字符串。为了成功解密,它必须是与ASYMMETRIC_ENCRYPT()一起使用以生成加密字符串的私钥或公钥字符串对应的公钥或私钥字符串。 * algorithm *table 示用于创建密钥的加密算法。

支持的* 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(算法,str,key_str)

使用给定的算法和密钥字符串对字符串进行加密,然后将生成的密文作为二进制字符串返回。如果加密失败,则结果为NULL

  • str 长度不能大于 key_str *长度-11,以字节为单位

  • key_str *必须是 PEM 格式的有效密钥字符串。 * algorithm *table 示用于创建密钥的加密算法。

支持的* 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);

Suppose that:

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(算法,digest_str,priv_key_str,digest_type)

使用私钥字符串对摘要字符串进行签名,并将签名作为二进制字符串返回。如果签名失败,则结果为NULL

  • digest_str *是摘要字符串。可以通过调用CREATE_DIGEST()生成它。 * digest_type *table 示用于生成摘要字符串的摘要算法。

  • priv_key_str *是用于对摘要字符串进行签名的私钥字符串。它必须是 PEM 格式的有效密钥字符串。 * algorithm *table 示用于创建密钥的加密算法。

支持的* algorithm *值:'RSA''DSA'

支持的* digest_type *值:'SHA224''SHA256''SHA384''SHA512'

有关用法示例,请参见ASYMMETRIC_VERIFY()的描述。

ASYMMETRIC_VERIFY(算法,digest_str,sig_str,pub_key_str,digest_type)

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

  • digest_str *是摘要字符串。可以通过调用CREATE_DIGEST()生成它。 * digest_type *table 示用于生成摘要字符串的摘要算法。

  • sig_str *是签名字符串。可以通过调用ASYMMETRIC_SIGN()生成它。

  • pub_key_str *是签名者的公钥字符串。它对应于传递给ASYMMETRIC_SIGN()以生成签名字符串的私钥,并且必须是 PEM 格式的有效密钥字符串。 * algorithm *table 示用于创建密钥的加密算法。

支持的* 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 施加的约束。服务器 Management 员可以通过设置环境变量来限制最大密钥长度。参见第 12.19.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 *table 示用于创建密钥的加密算法。

支持的* algorithm *值:'RSA''DSA''DH'

有关用法示例,请参见CREATE_ASYMMETRIC_PRIV_KEY()的描述。

CREATE_DH_PARAMETERS(key_len)

创建用于生成 DH 私钥/公钥对的共享密钥,并返回可以传递给CREATE_ASYMMETRIC_PRIV_KEY()的二进制字符串。如果 Secret 生成失败,则结果为 null。

支持的* key_len *值:最小和最大密钥长度(以位为单位)为 1,024 和 10,000.这些密钥长度限制是 OpenSSL 施加的约束。服务器 Management 员可以通过设置环境变量来限制最大密钥长度。参见第 12.19.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()