从 MySQL 8.0.30 开始,MySQL 企业加密的函数由 MySQL 组件 component_enterprise_encryption 提供。本参考手册描述了这些函数。
有关升级到由 MySQL 组件 component_enterprise_encryption 提供的新组件函数的信息,以及遗留函数和组件函数之间行为差异的列表,请参阅 升级 MySQL 企业加密。
在 MySQL 8.0.30 之前的版本中基于 openssl_udf 共享库的遗留函数的参考手册是 第 8.6.6 节,“MySQL 企业加密遗留函数描述”。
MySQL 企业加密函数具有以下一般特征:
-
对于类型错误或参数数量错误的参数,每个函数都返回错误。
-
如果参数不适合函数执行请求的操作,则返回
NULL或 0,以适应情况。例如,如果函数不支持指定的算法,密钥长度太短或太长,或者字符串期望是 PEM 格式的密钥字符串但不是有效的密钥。 -
底层 SSL 库负责随机数初始化。
组件函数仅支持 RSA 加密算法。
有关其他示例和讨论,请参阅 第 8.6.3 节,“MySQL 企业加密使用和示例”。
-
asymmetric_decrypt(algorithm,data_str,priv_key_str)使用给定的算法和密钥字符串解密加密字符串,并返回结果明文作为二进制字符串。如果解密失败,结果为
NULL。对于在 MySQL 8.0.29 之前的版本中使用的遗留函数,请参阅 第 8.6.6 节,“MySQL 企业加密遗留函数描述”。
默认情况下,
component_enterprise_encryption函数假设加密文本使用 RSAES-OAEP 填充方案。该函数支持解密由遗留openssl_udf共享库函数加密的内容,如果系统变量enterprise_encryption.rsa_support_legacy_padding设置为ON(默认为OFF)。当设置为ON时,该函数还支持 RSAES-PKCS1-v1_5 填充方案,如遗留openssl_udf共享库函数所用。当设置为OFF时,无法解密由遗留函数加密的内容,并且函数返回 null 输出。algorithm是用于创建密钥的加密算法。支持的算法值是'RSA'。data_str是要解密的加密字符串,该字符串是使用asymmetric_encrypt()加密的。priv_key_str是一个有效的 PEM 编码的 RSA 私钥。为了成功解密,密钥字符串必须对应于使用asymmetric_encrypt()产生加密字符串的公钥字符串。asymmetric_encrypt()组件函数仅支持使用公钥进行加密,因此解密使用相应的私钥。有关使用示例,请参阅
asymmetric_encrypt()的描述。 -
asymmetric_encrypt(algorithm,data_str,pub_key_str)使用给定的算法和密钥字符串加密字符串,并返回结果密文作为二进制字符串。如果加密失败,结果为
NULL。对于在 MySQL 8.0.29 之前的版本中使用的遗留函数,请参阅 第 8.6.6 节,“MySQL 企业加密遗留函数描述”。
算法是用于创建密钥的加密算法。支持的算法值是'RSA'。data_str是要加密的字符串。该字符串的长度不能超过密钥字符串的长度减去 42(以便于填充)。pub_key_str是一个有效的 PEM 编码的 RSA 公钥。asymmetric_encrypt()组件函数仅支持使用公钥进行加密。要恢复原始未加密的字符串,请将加密后的字符串传递给
asymmetric_decrypt(),连同用于加密的密钥对的另一部分,如以下示例所示:-- Generate private/public key pair SET @priv = create_asymmetric_priv_key('RSA', 2048); SET @pub = create_asymmetric_pub_key('RSA', @priv); -- 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, @pub), @priv) = @s -
asymmetric_sign(algorithm,text,priv_key_str,digest_type)使用私钥签名摘要字符串或数据字符串,并返回签名作为二进制字符串。如果签名失败,结果为
NULL。对于在 MySQL 8.0.29 之前使用的遗留版本的此函数,请参阅 第 8.6.6 节,“MySQL Enterprise Encryption Legacy Function Descriptions”。
algorithm是用于创建密钥的加密算法。支持的算法值是'RSA'。text是数据字符串或摘要字符串。该函数接受摘要,但不需要它们,因为它也可以处理任意长度的数据字符串。可以通过调用create_digest()生成摘要字符串。priv_key_str是用于签名摘要字符串的私钥字符串。它必须是一个有效的 PEM 编码的 RSA 私钥。digest_type是用于签名数据的算法。支持的digest_type值是'SHA224'、'SHA256'、'SHA384'和'SHA512',当使用 OpenSSL 1.0.1 时。如果使用 OpenSSL 1.1.1,则还支持digest_type值'SHA3-224'、'SHA3-256'、'SHA3-384'和'SHA3-512'。有关使用示例,请参阅
asymmetric_verify()的描述。 -
asymmetric_verify(algorithm,text,sig_str,pub_key_str,digest_type)验证签名字符串是否与摘要字符串匹配,并返回 1 或 0,以指示验证是否成功。如果验证失败,结果为
NULL。对于在 MySQL 8.0.29 之前使用的遗留版本的此函数,请参阅 第 8.6.6 节,“MySQL Enterprise Encryption Legacy Function Descriptions”。
默认情况下,
component_enterprise_encryption函数假设签名使用 RSASSA-PSS 签名方案。该函数支持验证由遗留openssl_udf共享库函数生成的签名,如果系统变量enterprise_encryption.rsa_support_legacy_padding设置为ON(默认为OFF)。当设置为ON时,该函数还支持 RSASSA-PKCS1-v1_5 签名方案,如遗留openssl_udf共享库函数所用。当设置为OFF时,无法验证由遗留函数生成的签名,该函数将返回 null 输出。algorithm是用于创建密钥的加密算法。支持的算法值是'RSA'。text是数据字符串或摘要字符串。该组件函数接受摘要,但不需要它们,因为它也可以处理任意长度的数据字符串。可以通过调用create_digest()生成摘要字符串。sig_str是要验证的签名字符串。可以通过调用asymmetric_sign()生成签名字符串。pub_key_str是签名者的公钥字符串。它对应于传递给asymmetric_sign()生成签名字符串的私钥。它必须是一个有效的 PEM 编码的 RSA 公钥。digest_type是用于签名数据的算法。支持的digest_type值是'SHA224'、'SHA256'、'SHA384'和'SHA512',当使用 OpenSSL 1.0.1 时。如果使用 OpenSSL 1.1.1,则还支持digest_type值'SHA3-224'、'SHA3-256'、'SHA3-384'和'SHA3-512'。-- Set the encryption algorithm and digest type SET @algo = 'RSA'; SET @dig_type = 'SHA512'; -- Create private/public key pair SET @priv = create_asymmetric_priv_key(@algo, 2048); 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_length)使用给定的算法和密钥长度创建私钥,并将密钥作为 PEM 格式的二进制字符串返回。如果密钥生成失败,结果为
NULL。对于在 MySQL 8.0.29 之前使用的遗留版本的该函数,请参阅 第 8.6.6 节,“MySQL Enterprise Encryption Legacy Function Descriptions”。
algorithm是用于创建密钥的加密算法。支持的算法值是'RSA'。key_length是密钥的位长。如果超过最大允许的密钥长度或指定的密钥长度小于最小允许的密钥长度,密钥生成将失败,结果为 null 输出。最小允许的密钥长度是 2048 位。最大允许的密钥长度是enterprise_encryption.maximum_rsa_key_size系统变量的值,默认为 4096。它的最大设置为 16384,是 RSA 算法允许的最大密钥长度。请参阅 第 8.6.2 节,“Configuring MySQL Enterprise Encryption”。Note生成更长的密钥可能会消耗大量 CPU 资源。使用
enterprise_encryption.maximum_rsa_key_size系统变量限制密钥长度,可以在提供足够的安全性同时平衡资源使用。例如,创建一个 2048 位的 RSA 私钥,然后从私钥派生出公钥:
SET @priv = create_asymmetric_priv_key('RSA', 2048); SET @pub = create_asymmetric_pub_key('RSA', @priv); -
create_asymmetric_pub_key(algorithm,priv_key_str)使用给定的算法和私钥派生出公钥,并将公钥作为 PEM 格式的二进制字符串返回。如果公钥派生失败,结果为
NULL。对于在 MySQL 8.0.29 之前使用的遗留版本的该函数,请参阅 第 8.6.6 节,“MySQL Enterprise Encryption Legacy Function Descriptions”。
algorithm是用于创建密钥的加密算法。支持的算法值是'RSA'。priv_key_str是一个有效的 PEM 编码的 RSA 私钥。有关使用示例,请参阅
create_asymmetric_priv_key()的描述。 -
create_digest(digest_type,str)使用给定的字符串和摘要类型创建摘要,并将摘要作为二进制字符串返回。如果摘要生成失败,结果为
NULL。对于在 MySQL 8.0.29 之前使用的遗留版本的该函数,请参阅 第 8.6.6 节,“MySQL Enterprise Encryption Legacy Function Descriptions”。
生成的摘要字符串适合与
asymmetric_sign()和asymmetric_verify()一起使用。这些函数的组件版本接受摘要,但不需要它们,因为它们可以处理任意长度的数据。digest_type是用于生成摘要字符串的摘要算法。支持的digest_type值是'SHA224'、'SHA256'、'SHA384'和'SHA512',当使用 OpenSSL 1.0.1 时。如果使用 OpenSSL 1.1.1,额外的digest_type值'SHA3-224'、'SHA3-256'、'SHA3-384'和'SHA3-512'也可用。str是要生成摘要的非空数据字符串。SET @dig = create_digest('SHA512', 'The quick brown fox');