集成PyEncMySQL

PyEncMySQL是全密态MySQL的Python版客户端,在正确配置MEK、阿里云ak/sk等参数的基础上,可以使应用端程序拿到明文数据。业务侧只需要进行少量配置文件上的更改即可对PyEncMySQL进行集成。本文档介绍了如何使用PyEncMySQL

准备工作

  • 获取加密数据库连接信息。您首先需要获取加密数据库的连接信息,如域名(host)、端口(port)、数据库实例名(dbname)、用户名(username)、密码(password)等。

  • 配置加密规则。具体操作请参见新建加密规则

  • 配置密钥和加密算法。

    • MEK是您的用户主密钥。只有设置了正确的MEK,您才能在客户端解密数据并获取到明文。目前已支持的加密算法有AES-128SM4-128,用到的密钥都是128位的,可以用一个长度为32位的16进制串表示,例如:0x00112233445566778899aabbccddeeff

    • encAlgo是您需要的具体的加密/解密算法。目前支持AESSM4(也就是国密)两个大类,其中具体的算法有:

      • AES_128_GCM

      • AES_128_CBC

      • AES_128_CTR

      • AES_128_ECB(不推荐)

      • SM4_128_GCM

      • SM4_128_CBC(默认)

      • SM4_128_CTR

      • SM4_128_ECB(不推荐)。

  • 写入配置文件。

    您需要新建1个文件如:encjdbc.conf,在文件里面写入上面提到的各项信息,然后请记录该配置文件的绝对路径:

    MEK=
    encAlgo=

安装PyEncMySQL

  1. 执行以下命令安装Python层代码pyencmysql-1.tar.gz文件:

    pip install pyencmysql-1.0.0.tar.gz  --user
  2. 在系统内任意位置放置encjdbc-mysql-8-1.0.0-SNAPSHOT.jar文件,并记录它的绝对路径。

配置示例

以下示例是一个简单的代码,里面新建了一张表test,并对v列进行加密配置。

import pyencmysql
conn = pyencmysql.connect(user=USERNAME, password=PASSWORD, host=HOST,
    port=PORT, database=DATABASE, encjdbc_conf=ENCJDBC_CONF_PATH, 
    encjdbc_jar_path=ENCJDBC_JAR_PATH)
cursor = conn.cursor()
cursor.execute("drop table if exists test")
cursor.execute("create table test (v int)")
cursor.execute("insert into test values(1)")
cursor.execute("insert into test values(2)")
cursor.execute("insert into test values(3)")
cursor.execute("insert into test values(4)")
cursor.execute("insert into test values(5)")
cursor.execute("select * from test")
print(cursor.fetchall())

输出:

((1,), (2,), (3,), (4,), (5,))

集成到Web应用

PyEncMySQL实现了和MySQLdbPyMySQL一致的接口,因此应用侧可以无感的将MySQLdbPyMySQL等MySQL数据库连接器替换为PyEncMySQL

以下示例提供了一套集成到Django的解决方案:

import pyencmysql
pyencmysql.install_as_MySQLdb()
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',   # 数据库引擎
        'NAME': 'XXX',       # 数据库名
        'USER': 'XXX',       # 数据库用户名
        'PASSWORD': 'XXX',   # 数据库密码
        'HOST': 'XXX',       # 数据库主机
        'PORT': 'XXX',       # 数据库使用的端口
        'OPTIONS': {
            'encjdbc_conf': 'XXX',      # 上面提到的ENCJDBC_CONF_PATH
            'encjdbc_jar_path': 'XXX',  # 上面提到的ENCJDBC_JAR_PATH
        }
    }
}

然后您就可以正常运行您的Django Web应用了。