• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • MySQL企业加密用法和示例

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

    • 使用RSA加密创建私钥/公钥对
    • 使用私钥对数据进行加密,并使用公钥对数据进行解密
    • 从字符串生成摘要
    • 将摘要与密钥对一起使用
    • 创建一个对称密钥
    • 通过密钥生成操作限制CPU使用率

    使用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私钥/公钥作为输入。通过将密钥长度传递给来创建密钥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

    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));
    

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

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

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

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

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

    • MYSQL_OPENSSL_UDF_DSA_BITS_THRESHOLD:的最大DSA密钥长度(以位为单位)CREATE_ASYMMETRIC_PRIV_KEY()。此变量的最小值和最大值是1,024和10,000。
    • MYSQL_OPENSSL_UDF_RSA_BITS_THRESHOLD:的最大RSA密钥长度(以位为单位)CREATE_ASYMMETRIC_PRIV_KEY()。此变量的最小值和最大值是1,024和16,384。
    • MYSQL_OPENSSL_UDF_DH_BITS_THRESHOLD:的最大密钥长度(以位为单位)CREATE_DH_PARAMETERS()。此变量的最小值和最大值是1,024和10,000。

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

    export MYSQL_OPENSSL_UDF_DSA_BITS_THRESHOLD=4096
    export MYSQL_OPENSSL_UDF_RSA_BITS_THRESHOLD=4096
    

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