一、背景简介

根据数据安全规范与标准及企业合法合规运营,业务系统需要对海量的业务数据进行加密,保护数据的安全。

1.1 业务数据的安全性要求

  • 敏感业务数据需要加密存储
  • 数据查询需要进行解密
  • 加密数据的密钥支持定期轮换

二、方案预研

对于上述业务数据的加密要求,一般采用加密性能较高的对称加密算法,如:AES、国密SM4等。系统的数据加解密及密钥的管理及定期轮换,行业内一般是采用密钥管理服务(Key Management Service,简称KMS)来解决,下面我们就预研一下KMS的使用。

2.1 密钥管理服务KMS

密钥管理,即密钥管理服务(Key Management Service,KMS),是一种安全、可靠、简单易用的密钥托管服务,帮助您轻松创建和管理密钥,保护密钥的安全。

KMS通过使用硬件安全模块HSM(Hardware Security Module)保护密钥的安全,所有的用户密钥都由HSM中的根密钥保护,避免密钥泄露。

KMS对密钥的所有操作都会进行访问控制及日志跟踪,提供所有密钥的使用记录,满足审计和合规性要求。

2.2 KMS服务选型

密钥管理服务使用硬件安全模块HSM(Hardware Security Module)保护密钥的安全,企业内部如果是要自己搭建密钥管理服务,则需要采购专业的硬件设备进行搭建。对于没有专业的安全团队的公司,选择云厂商提供的KMS服务是一个更加高效便捷的途径。

目前提供KMS云服务能力的厂商:

上述云厂商提供的KMS服务能力基本相同,介于企业内部使用华为云,本文主要介绍基于华为云KMS的海量业务数据加密场景的落地。

三、华为云KMS简介

华为云提供统一管理密钥、敏感数据加密、华为云服务加密、数据数字签名、安全合规(PCI-DSS、等保等)等能力。

3.1 功能总览

功能 说明
密钥管理 密钥管理,即密钥管理服务(Key Management Service,KMS),是一种安全、可靠、简单易用的密钥托管服务,帮助您轻松创建和管理密钥,保护密钥的安全。
KMS通过使用硬件安全模块HSM(Hardware Security Module)保护密钥的安全,所有的用户密钥都由HSM中的根密钥保护,避免密钥泄露。
创建密钥 用户主密钥有密钥元数据(密钥ID、密钥别名、描述、密钥状态与创建日期)和用于加解密数据的密钥材料。
用户可以使用控制台创建密钥,该密钥会自动生成密钥材料。
密钥全生命周期管理 用户可以通过密钥管理界面,对用户主密钥进行全生命周期管理。(启用、禁用、删除)
数据加解密 当有少量数据(例如:口令、证书、电话号码等)需要加解密时,用户可以通过密钥管理服务(Key Management Service,KMS)界面使用在线工具加解密数据,或者调用KMS的API接口使用指定的用户主密钥直接加密、解密数据。
当有大量数据(例如:照片、视频或者数据库文件等)需要加解密时,用户可采用信封加密方式加解密数据,无需通过网络传输大量数据即可完成数据加解密。
密钥轮换 广泛重复的使用加密密钥,会对加密密钥的安全造成风险。为了确保加密密钥的安全性,建议您定期轮换密钥,更改原密钥的密钥材料。
开通密钥轮转后,会收取相应的密钥存储费用,每个轮转的版本将作为一个独立的主密钥资源进行计算。
专属密钥库 KMS通过专属密钥库支持HYOK功能,帮助用户完全自主可控名下的用户主密钥,用户主密钥不脱离加密机,并且密码运算完全在加密机中完成。
说明:在外部密钥存储中使用 KMS 密钥的加密和解密操作,由您的外部密钥管理器使用加密密钥材料执行,该功能称为持有自己的密钥(HYOK)。
签名验签 签名验签是一种加密机制,是保证数据传输安全性以及完整性的重要手段。
通过签名验签的方式,可以防止信息在传输过程中被篡改或伪造。
密钥授权 用户可以为其他IAM用户或账号创建授权,授予其使用自身的自定义密钥的权限。被授权用户可以通过调用API接口,即可使用被授权的权限。
以下两种情况下,授权用户可以通过密钥管理界面撤销授权:
· 当被授权用户不再使用授权用户的自定义密钥时,被授权用户可告知授权用户撤销授权,或者通过API接口直接退役授权。
· 当授权用户想收回自定义密钥的操作权限时,授权用户可强制撤销授权。
密钥区域性 KMS通过密钥区域性,实现密钥跨区域使用。每组用户主密钥与副本密钥具有相同的密钥材料,即可以实现在不同区域的密钥共享。
· 创建副本密钥
· 使用副本密钥

3.2 信封加密术语说明(谷歌KMS

对于海量的业务数据加解密场景,采用信封加密的方式对业务进行加密,下面我们介绍一下何为信封加密。

数据加密密钥(DEK)

用于加密数据密钥本身称为数据加密密钥 (Data Encryption Key, 简称DEK)。
以下是管理 DEK 的最佳做法:

  • 在本地生成 DEK。
  • 存储时,始终确保 DEK 进行静态加密。
  • 为便于访问,请将 DEK 存储在用其进行加密的数据附近
  • 每次写入数据时均生成一个新的 DEK。这意味着您无需轮替 DEK。
  • 请勿使用相同的 DEK 来加密来自两个不同用户的数据。
  • 在伽罗瓦计数器模式 (GCM) 中使用强大的算法(如 256 位高级加密标准 (AES))。

密钥加密密钥(KEK)

DEK 使用“密钥加密密钥”(Key Encryption Key, 简称KEK) 进行加密(也称为“封装”)。 用另一个密钥对密钥进行加密的过程称为“信封加密”。
说明: KEK是谷歌的命名方式,华为云的命名是CMK(Customer Master Key),是同一个概念。
以下是管理 DEK 的最佳做法:

  • 集中存储 KEK。
  • 根据用例加密设置 KEK 加密的 DEK 的粒度。例如,考虑需要多个 DEK 来加密其数据区块的工作负载。您可以使用单个 KEK 来封装负责该工作负载加密的所有 DEK。
  • 定期或可疑事件发生后轮替密钥。

平衡 DEK 和 KEK

通过让 KEK 的数量少于 DEK 并且使用集中式密钥管理服务,我们得以让大规模的数据存储和加密工作变得更加切实可行。中央密钥服务还可以作为一个点,用于更轻松地审核和限制数据访问。

根据您的情况和要加密的数据量,您可以选择使用类似的模型。单个 KEK 可用于保护许多 DEK;该模型允许各个数据对象各自拥有自己的 DEK,而不会大量增加存储在中央密钥管理服务中的密钥量。

3.3 华为云KMS信封加密简介(官网)

当有大量数据(例如:照片、视频或者数据库文件等)需要加解密时,用户可采用信封加密方式加解密数据,无需通过网络传输大量数据即可完成数据加解密。

大量数据加密

大量数据加密
说明如下:

  1. 用户需要在KMS中创建一个用户主密钥。
  2. 用户调用KMS的“create-datakey”接口创建数据加密密钥。用户得到一个明文的数据加密密钥和一个密文的数据加密密钥。其中密文的数据加密密钥是由指定的用户主密钥加密明文的数据加密密钥生成的。
  3. 用户使用明文的数据加密密钥来加密明文文件,生成密文文件。
  4. 用户将密文的数据加密密钥和密文文件一同存储到持久化存储设备或服务中。

大量数据解密

大量数据解密
说明如下:

  1. 用户从持久化存储设备或服务中读取密文的数据加密密钥和密文文件。
  2. 用户调用KMS的“decrypt-datakey”接口,使用对应的用户主密钥(即生成密文的数据加密密钥时所使用的用户主密钥)来解密密文的数据加密密钥,取得明文的数据加密密钥。
    如果对应的用户主密钥被误删除,会导致解密失败。因此,需要妥善管理好用户主密钥。
  3. 用户使用明文的数据加密密钥来解密密文文件。

四、本地数据加解密方案实践

在上述云厂商的KMS服务提供的大量数据加解密的案例中,加密后的数据和加密后的数据加密密钥DEK一起进行存储。
基于数据安全的需求,需要对数据加密密钥进行定期的轮换。对于加密后的数据,业务场景存在对加密数据进行精确查询的需求,需要根据数据加密密钥对查询参数进行加密查询

综上,我们对KMS的信封加密的标准流程进行一些本地项目落地的调整。
海量数据加解密

方案说明:

  1. 本地开发一个密钥管理服务,实现数据加密密钥的管理
  2. 数据加密密钥定期轮换,并指定数据加密密钥的数据类型生效时间版本号
  3. 应用引入定制加解密SDK,数据加密时根据数据类型生效时间选择对应版本号的数据加密密钥进行加密
  4. 加密后的密文同时拼接加密所用的密钥版本号
  5. 加密数据查询时,根据查询数据的类型及时间,选择对应版本号的数据加密密钥对参数加密后进行精确查询

4.1 数据加密密钥的数据安全分析

密钥服务的密钥数据

  1. 密钥服务需要对密钥数据进行持久化保存,并做数据的定期备份,防止密钥数据丢失
  2. 密钥服务持久化的密钥数据是使用KMS上的用户主密钥进行加密,必须调用华为云KMS的接口才能对密钥数据解密
  3. 华为云KMS接口使用IAM账号进行鉴权,鉴权通过IAM账号的访问密钥(AK/SK,Access Key ID/Secret Access Key)

华为云IAM账号访问密钥AK/SK

  1. 使用K8s的secrets存储华为云接口的AK/SK信息,避免接口账号信息泄漏。

SDK与密钥服务访问

  1. 使用IP白名单进行限制访问
  2. 使用appId、appSecret进行身份鉴权
  3. 基于应用信息进行签名验证等

五、华为云KMS验证

在基于华为云KMS服务进行海量数据加解密的场景中,我们主要用到一下3个接口:

  1. 控制台创建主密钥
  2. 接口创建数据密钥
  3. 接口解密数据密钥

5.1 控制台创建主密钥

创建主密钥

5.2 创建数据密钥

创建数据加密密钥
调用华为云创建数据加密密钥的接口,会返回明文和密文的数据加密密钥(DEK),如下:

{
 "plain_text": "43456936300d023645e0d7898d44c3a98b98c1b67cf611ccbfe8b9f5460d7095",
 "key_id": "2eef7f6e-7686-45c5-95c4-ddd6459d2e83",
 "cipher_text": "050064004ab28a42d6fff08045cd023000e738415a5de6ebccb0cebab73c14369fcc33e5dbc1d36c96739a4edd989eae2be4155a95374dfb04eef8581b95b6df32656566376636652d373638362d343563352d393563342d6464643634353964326538330000000014131211100f0e0d0c0b0a090807060504030201e3b815d0aae3791dfc9947897bfc20188f71c8ab4827c10f555bf3cc894cbbfe"
}

5.3 解密数据密钥

解密数据密钥
调用解密数据密钥接口,对本地存储的加密后的数据密钥进行解密。

请求参数

{
 "key_id": "2eef7f6e-7686-45c5-95c4-ddd6459d2e83",
 "cipher_text": "050064004ab28a42d6fff08045cd023000e738415a5de6ebccb0cebab73c14369fcc33e5dbc1d36c96739a4edd989eae2be4155a95374dfb04eef8581b95b6df32656566376636652d373638362d343563352d393563342d6464643634353964326538330000000014131211100f0e0d0c0b0a090807060504030201e3b815d0aae3791dfc9947897bfc20188f71c8ab4827c10f555bf3cc894cbbfe",
 "datakey_cipher_length": "312"
}

响应参数

{
 "datakey_dgst": "1a96e1bcf8849e04e9e6786b4fcfa779260fac66ecd2233a413dc35c1d48fecb",
 "data_key": "43456936300d023645e0d7898d44c3a98b98c1b67cf611ccbfe8b9f5460d7095",
 "datakey_length": "32"
}

六、总结

本文主要介绍基于KMS的海量数据加解密方式,在本地大量数据加解密的场景下,一般采用信封加密的方式对业务数据进行加密。在本地业务落地过程中,基于加密数据查询的需求及数据存储的要求,我们对标准的信封加密方式进行调整,引入本地密钥服务,实现对数据加密密钥生效时间和版本的管理,更好的适配本地海量业务数据加密的场景。