12.19.2 MySQL 企业版加密用法和示例

要在应用程序中使用 MySQL 企业加密,请调用与您要执行的操作相对应的功能。本节演示如何执行一些代 table 性的任务:

使用 RSA 加密创建私钥/公钥对

-- Encryption algorithm; can be 'DSA' or 'DH' instead
SET @algo = 'RSA';
-- Key length in bits; make larger for stronger keys
SET @key_len = 1024;

-- Create private key
SET @priv = CREATE_ASYMMETRIC_PRIV_KEY(@algo, @key_len);
-- Derive corresponding public key from private key, using same algorithm
SET @pub = CREATE_ASYMMETRIC_PUB_KEY(@algo, @priv);

现在,您可以使用密钥对来加密和解密数据,签名和验证数据,或生成对称密钥。

使用私钥对数据进行加密,并使用公钥对数据进行解密

这要求密钥对的成员是 RSA 密钥。

SET @ciphertext = ASYMMETRIC_ENCRYPT(@algo, 'My secret text', @priv);
SET @plaintext = ASYMMETRIC_DECRYPT(@algo, @ciphertext, @pub);

相反,您可以使用公钥加密,也可以使用私钥解密。

SET @ciphertext = ASYMMETRIC_ENCRYPT(@algo, 'My secret text', @pub);
SET @plaintext = ASYMMETRIC_DECRYPT(@algo, @ciphertext, @priv);

无论哪种情况,为加密和解密功能指定的算法必须与用于生成密钥的算法匹配。

从字符串生成摘要

-- Digest type; can be 'SHA256', 'SHA384', or 'SHA512' instead
SET @dig_type = 'SHA224';

-- Generate digest string
SET @dig = CREATE_DIGEST(@dig_type, 'My text to digest');

将摘要与密钥对一起使用

密钥对可用于对数据签名,然后验证签名与摘要匹配。

-- Encryption algorithm; could be 'DSA' instead; keys must
-- have been created using same algorithm
SET @algo = 'RSA';

-- Generate signature for digest and verify signature against digest
SET @sig = ASYMMETRIC_SIGN(@algo, @dig, @priv, @dig_type);
-- Verify signature against digest
SET @verf = ASYMMETRIC_VERIFY(@algo, @dig, @sig, @pub, @dig_type);

创建对称密钥

这需要使用共享对称机密创建的 DH 私钥/公钥作为 Importing。通过将密钥长度传递给CREATE_DH_PARAMETERS()来创建密钥,然后将密钥作为“密钥长度”传递给CREATE_ASYMMETRIC_PRIV_KEY()

-- Generate DH shared symmetric secret
SET @dhp = CREATE_DH_PARAMETERS(1024);
-- Generate DH key pairs
SET @algo = 'DH';
SET @priv1 = CREATE_ASYMMETRIC_PRIV_KEY(@algo, @dhp);
SET @pub1 = CREATE_ASYMMETRIC_PUB_KEY(@algo, @priv1);
SET @priv2 = CREATE_ASYMMETRIC_PRIV_KEY(@algo, @dhp);
SET @pub2 = CREATE_ASYMMETRIC_PUB_KEY(@algo, @priv2);

-- Generate symmetric key using public key of first party,
-- private key of second party
SET @sym1 = ASYMMETRIC_DERIVE(@pub1, @priv2);

-- Or use public key of second party, private key of first party
SET @sym2 = ASYMMETRIC_DERIVE(@pub2, @priv1);

可以在运行时创建键字符串值,并使用SETSELECTINSERT将其存储到变量或 table 中:

SET @priv1 = CREATE_ASYMMETRIC_PRIV_KEY('RSA', 1024);
SELECT CREATE_ASYMMETRIC_PRIV_KEY('RSA', 1024) INTO @priv2;
INSERT INTO t (key_col) VALUES(CREATE_ASYMMETRIC_PRIV_KEY('RSA', 1024));

具有FILE特权的用户可以使用LOAD_FILE()函数读取文件中存储的键字符串值。

摘要和签名字符串可以类似地处理。

通过密钥生成操作限制 CPU 使用率

CREATE_ASYMMETRIC_PRIV_KEY()CREATE_DH_PARAMETERS()加密函数采用密钥长度参数,并且这些函数所需的 CPU 资源量随密钥长度的增加而增加。对于某些安装,如果应用程序经常生成过长的密钥,则可能导致 CPU 使用率过高。

OpenSSL 规定所有密钥的最小密钥长度为 1,024 位。 OpenSSL 还为CREATE_ASYMMETRIC_PRIV_KEY()分别为 DSA 和 RSA 密钥强加了 10,000 位的最大密钥长度和 16,384 位,对于CREATE_DH_PARAMETERS()则强加了 10,000 位的最大密钥长度。如果这些最大值过高,则从 MySQL 5.7.17 开始,三个环境变量可用,以使 MySQL 服务器 Management 员可以为密钥生成设置较低的最大长度,从而限制 CPU 使用率:

  • MYSQL_OPENSSL_UDF_DSA_BITS_THRESHOLDCREATE_ASYMMETRIC_PRIV_KEY()的最大 DSA 密钥长度(以位为单位)。此变量的最小值和最大值是 1,024 和 10,000.

  • MYSQL_OPENSSL_UDF_RSA_BITS_THRESHOLDCREATE_ASYMMETRIC_PRIV_KEY()的最大 RSA 密钥长度(以位为单位)。此变量的最小值和最大值是 1,024 和 16,384.

  • MYSQL_OPENSSL_UDF_DH_BITS_THRESHOLDCREATE_DH_PARAMETERS()的最大密钥长度(以位为单位)。此变量的最小值和最大值是 1,024 和 10,000.

要使用任何这些环境变量,请在启动服务器的进程环境中进行设置。如果设置,则其值优先于 OpenSSL 施加的最大密钥长度。例如,要为 DSA 和CREATE_ASYMMETRIC_PRIV_KEY()设置最大密钥长度为 4,096 位,请设置以下变量:

export MYSQL_OPENSSL_UDF_DSA_BITS_THRESHOLD=4096
export MYSQL_OPENSSL_UDF_RSA_BITS_THRESHOLD=4096

该示例使用 Bourne shell 语法。其他 Shell 的语法可能有所不同。