创建加密表

本文将通过参数说明和示例代码为您介绍如何使用 Go SDK 创建加密数据表,实现数据加密存储功能。表格存储提供两种加密方式:基于密钥管理服务(Key Management Service,简称 KMS)的密钥加密和基于自带密钥(Bring Your Own Key,简称 BYOK)的自定义密钥加密。

前提条件

接口和参数

接口和具体参数信息,请参见创建数据表

基于 KMS 服务密钥加密

首次使用基于KMS密钥的方式创建数据表时,表格存储会自动创建一个KMS服务密钥,通过服务密钥来加密数据,并在读取数据时自动解密。您无需购买KMS实例即可使用该功能。

以下示例用于创建数据表时基于 KMS 服务密钥加密数据。

func CreateTable(client *tablestore.TableStoreClient, tableName string) {
    createTableRequest := new(tablestore.CreateTableRequest)

    tableMeta := new(tablestore.TableMeta)
    //设置数据表名称。
    tableMeta.TableName = tableName
    //为数据表添加主键列。主键为pk(String类型)。
    tableMeta.AddPrimaryKeyColumn("pk", tablestore.PrimaryKeyType_STRING)

    tableOption := new(tablestore.TableOption)
    //数据的过期时间,-1表示永不过期。
    tableOption.TimeToAlive = -1
    //最大版本数,属性列值最多保留1个版本,即保存最新的版本。
    tableOption.MaxVersion = 1

    //设置预留读写吞吐量,容量型实例下的数据表只能设置为0,高性能型实例下的数据表可以设置为非零值。
    reservedThroughput := new(tablestore.ReservedThroughput)
    reservedThroughput.Readcap = 0
    reservedThroughput.Writecap = 0

    //打开服务器端加密功能,使用KMS的服务主密钥。
    sseSpec := new(tablestore.SSESpecification)
    sseSpec.SetEnable(true)
    sseSpec.SetKeyType(tablestore.SSE_KMS_SERVICE)

    createTableRequest.TableMeta = tableMeta
    createTableRequest.TableOption = tableOption
    createTableRequest.ReservedThroughput = reservedThroughput
    createTableRequest.SSESpecification = sseSpec
    _, err := client.CreateTable(createTableRequest)
    if err != nil {
        fmt.Println("Failed to create table with error:", err)
    } else {
	fmt.Println("Create table finished")
    }
}

基于 BYOK 自定义密钥加密

  1. 已开通 KMS 服务。具体操作,请参见购买和启用 KMS 实例

  2. 已通过 KMS 控制台创建软件密钥。具体操作,请参见密钥管理快速入门

  3. 创建自定义角色并配置权限。

    1. 创建自定义角色。具体操作,请参见创建可信实体为阿里云账号的 RAM 角色

      配置角色名称,本文设定为 AliyunOTSAccessingKMS

    2. 创建自定义权限策略,并配置 KMS 加解密权限。具体操作,请参见通过脚本编辑模式创建自定义权限策略

      配置权限策略名,本文设定为 otskmspolicytest。权限策略示例如下:

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "kms:Decrypt",
                      "kms:GenerateDataKey"
                  ],
                  "Resource": [
                      "*"
                  ]
              }
          ]
      }
    3. 为自定义角色 AliyunOTSAccessingKMS 授予 KMS 加解密权限策略 otskmspolicytest。具体操作,请参见为 RAM 角色授权

      授权完成后,记录角色的 ARN,即需要扮演角色的 ID。

      image

    4. 修改自定义角色的信任策略。具体操作,请参见修改 RAM 角色的信任策略

      角色的信任策略示例如下:

      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "Service": [
                "ots.aliyuncs.com"
              ]
            }
          }
        ],
        "Version": "1"
      }
  4. 创建数据表并配置 BYOK 密钥加密数据。

    func CreateTable(client *tablestore.TableStoreClient, tableName string) {
        createTableRequest := new(tablestore.CreateTableRequest)
    
        tableMeta := new(tablestore.TableMeta)
        //设置数据表名称。
        tableMeta.TableName = tableName
        //为数据表添加主键列。主键为pk(String类型)。
        tableMeta.AddPrimaryKeyColumn("pk", tablestore.PrimaryKeyType_STRING)
    
        tableOption := new(tablestore.TableOption)
        //数据的过期时间,-1表示永不过期。
        tableOption.TimeToAlive = -1
        //最大版本数,属性列值最多保留1个版本,即保存最新的版本。
        tableOption.MaxVersion = 1
    
        //设置预留读写吞吐量,容量型实例下的数据表只能设置为0,高性能型实例下的数据表可以设置为非零值。
        reservedThroughput := new(tablestore.ReservedThroughput)
        reservedThroughput.Readcap = 0
        reservedThroughput.Writecap = 0
    
        //打开服务器端加密功能,使用KMS的用户主密钥。
        sseSpec := new(tablestore.SSESpecification)
        sseSpec.SetEnable(true)
        sseSpec.SetKeyType(tablestore.SSE_BYOK)
        //keyIdKMS自定义服务密钥的ID,设置为步骤2中通过KMS控制台创建的软件密钥ID。
        sseSpec.SetKeyId("key-hzz65****************")
        //roleArn为角色ARN,设置为步骤3中记录的角色ARN信息。
        sseSpec.SetRoleArn("acs:ram::****************:role/aliyunotsaccessingkms")
    
        createTableRequest.TableMeta = tableMeta
        createTableRequest.TableOption = tableOption
        createTableRequest.ReservedThroughput = reservedThroughput
        createTableRequest.SSESpecification = sseSpec
        _, err := client.CreateTable(createTableRequest)
        if err != nil {
            fmt.Println("Failed to create table with error:", err)
        } else {
    	fmt.Println("Create table finished")
        }
    }

相关文档

  • 密钥管理服务 KMS(Key Management Service)是您的一站式密钥管理和数据加密服务平台、一站式凭据安全管理平台,提供简单、可靠、安全、合规的数据加密保护和凭据管理能力。更多信息,请参见密钥管理服务

  • 创建加密表后,您可以通过 DescribeTable 接口查询数据表的加密配置。