本文将通过参数说明和示例代码为您介绍如何使用 Go SDK 创建加密数据表,实现数据加密存储功能。表格存储提供两种加密方式:基于密钥管理服务(Key Management Service,简称 KMS)的密钥加密和基于自带密钥(Bring Your Own Key,简称 BYOK)的自定义密钥加密。
前提条件
已通过控制台创建实例。具体操作,请参见创建实例。
已初始化 OTSClient。具体操作,请参见初始化 OTSClient。
接口和参数
接口和具体参数信息,请参见创建数据表。
基于 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 自定义密钥加密
已开通 KMS 服务。具体操作,请参见购买和启用 KMS 实例。
已通过 KMS 控制台创建软件密钥。具体操作,请参见密钥管理快速入门。
创建自定义角色并配置权限。
创建自定义角色。具体操作,请参见创建可信实体为阿里云账号的 RAM 角色。
配置角色名称,本文设定为
AliyunOTSAccessingKMS
。创建自定义权限策略,并配置 KMS 加解密权限。具体操作,请参见通过脚本编辑模式创建自定义权限策略。
配置权限策略名,本文设定为
otskmspolicytest
。权限策略示例如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": [ "*" ] } ] }
为自定义角色
AliyunOTSAccessingKMS
授予 KMS 加解密权限策略otskmspolicytest
。具体操作,请参见为 RAM 角色授权。授权完成后,记录角色的 ARN,即需要扮演角色的 ID。
修改自定义角色的信任策略。具体操作,请参见修改 RAM 角色的信任策略。
角色的信任策略示例如下:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ots.aliyuncs.com" ] } } ], "Version": "1" }
创建数据表并配置 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) //keyId为KMS自定义服务密钥的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 接口查询数据表的加密配置。