ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AWS KMS 加密密钥管理实战:使用 AWS SDK for Kotlin 的完整代码示例指南

AWS KMS 加密密钥管理实战:使用 AWS SDK for Kotlin 的完整代码示例指南 示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载引言本文以开源仓库aws-doc-sdk-examples中 kotlin/services/kms/README.md 为主线系统讲解如何基于 AWS SDK for Kotlin 调用 AWS Key Management ServiceAWS KMS。AWS KMS 是面向云环境的加密与密钥管理服务用于创建、管理 KMS 密钥customer master keys并提供加密、解密、授权grant等核心能力。读完本文你将掌握 KMS 客户端的初始化方式、密钥全生命周期操作创建、描述、启停、列表、数据加解密、别名与授权的创建与撤销等 13 个独立 API 动作的 Kotlin 实现并了解对应的单元测试组织方式。1. 概述AWS KMS 与 SDK for KotlinAWS KMSKey Management Service是 AWS 提供的托管式加密与密钥管理服务支持集中创建和管理加密密钥并控制这些密钥在 AWS 服务与应用程序中的使用。在 SDK for Kotlin 中所有 KMS 操作都通过KmsClient完成该客户端位于aws.sdk.kotlin.services.kms包中。本仓库的示例代码位于 kotlin/services/kms 目录下源码统一放置在src/main/kotlin/com/kotlin/kms/包中包含 13 个示例文件覆盖 KMS 的核心 API类别文件对应 API 动作密钥管理CreateCustomerKey.ktCreateKey密钥管理DescribeKey.ktDescribeKey密钥管理DisableCustomerKey.ktDisableKey密钥管理EnableCustomerKey.ktEnableKey密钥管理ListKeys.ktListKeys数据加解密EncryptDataKey.ktEncrypt/Decrypt别名管理CreateAlias.ktCreateAlias别名管理DeleteAlias.ktDeleteAlias别名管理ListAliases.ktListAliases授权管理CreateGrant.ktCreateGrant授权管理RevokeGrant.ktRevokeGrant授权管理ListGrants.ktListGrants注意来自原 README运行这些示例代码和测试可能会在您的 AWS 账户中产生费用请参阅 AWS Pricing 与 Free Tier建议为代码授予最低权限least privilege只授予完成任务所需的最小权限这些代码并未在所有 AWS 区域经过测试请以 AWS Regional Services 为准。2. 环境准备Prerequisites原 README 指出运行示例的前置条件与kotlin目录下的总 README 一致即先完成 kotlin/README.md 中描述的Prerequisites部分。这些前置条件通常包括配置 AWS 凭证Access Key 与 Secret Access Key可通过环境变量、本地~/.aws/credentials配置文件或 IAM 角色获取安装并配置 JDK 与 Gradle本示例使用 Kotlin 协程与 suspend 函数依赖kotlinx-coroutines在项目中引入 AWS SDK for Kotlin 的 KMS 模块依赖。每个示例文件的头部注释均提示运行前请先完成开发环境与凭证设置详见 SDK for Kotlin 开发者指南的 setup 文档每个源文件如 CreateCustomerKey.kt 顶部均附有该提示。3. 初始化 KmsClient两种客户端构建方式从源码可以看出仓库中的示例统一使用以下两种方式构造KmsClient并始终搭配use块自动关闭底层资源方式一从环境读取配置推荐KmsClient.fromEnvironment { region us-west-2 }.use { kmsClient - // 执行 KMS 操作 }这是绝大多数示例采用的方式例如 CreateCustomerKey.kt。fromEnvironment会从环境变量、系统属性等来源解析凭证与配置region在配置块中显式指定为us-west-2。方式二直接构造客户端KmsClient { region us-west-2 }.use { kmsClient - // 执行 KMS 操作 }这种方式出现在 EncryptDataKey.kt 的decryptData函数中直接以内联配置块构造客户端其余操作仍通过fromEnvironment构造。两种方式的use都会在代码块结束后自动关闭客户端连接。4. 密钥生命周期管理4.1 创建密钥CreateKeyCreateCustomerKey.kt 演示如何创建对称客户主密钥。核心函数createKey接受描述字符串构造CreateKeyRequest并指定密钥类型与用途suspend fun createKey(keyDesc: String?): String? { val request CreateKeyRequest { description keyDesc customerMasterKeySpec CustomerMasterKeySpec.SymmetricDefault keyUsage KeyUsageType.fromValue(ENCRYPT_DECRYPT) } KmsClient.fromEnvironment { region us-west-2 }.use { kmsClient - val result kmsClient.createKey(request) println(Created a customer key with id result.keyMetadata?.arn) return result.keyMetadata?.keyId } }关键参数说明description密钥的描述信息示例默认值为Created by the AWS KMS Kotlin APIcustomerMasterKeySpec密钥规格示例使用CustomerMasterKeySpec.SymmetricDefault表示创建默认对称密钥keyUsage密钥用途示例通过KeyUsageType.fromValue(ENCRYPT_DECRYPT)指定该密钥用于加密与解密返回值取自result.keyMetadata?.keyId即新密钥的全局唯一 ID。从 KMSKotlinTest.kt 可以看到测试将创建的keyId保存在类级字段中供后续测试复用并断言keyId非空。4.2 描述密钥DescribeKeyDescribeKey.kt 演示如何获取密钥元数据。命令行为DescribeKey传入一个keyId示例格式如xxxxxbcd-12ab-34cd-56ef-1234567890absuspend fun describeSpecifcKey(keyIdVal: String?) { val request DescribeKeyRequest { keyId keyIdVal } KmsClient.fromEnvironment { region us-west-2 }.use { kmsClient - val response kmsClient.describeKey(request) println(The key description is ${response.keyMetadata?.description}) println(The key ARN is ${response.keyMetadata?.arn}) } }返回值keyMetadata中的description与arn被打印输出。注意main函数通过exitProcess(0)在参数数量不符时打印用法说明并退出这种参数校验模式在本目录的多个示例中一致出现。4.3 启用与禁用密钥EnableKey / DisableKeyEnableCustomerKey.kt 与 DisableCustomerKey.kt 分别演示EnableKey与DisableKey二者请求结构完全相同仅调用动作相反// 禁用 suspend fun disableKey(keyIdVal: String?) { val request DisableKeyRequest { keyId keyIdVal } KmsClient.fromEnvironment { region us-west-2 }.use { kmsClient - kmsClient.disableKey(request) println($keyIdVal was successfully disabled) } } // 启用 suspend fun enableKey(keyIdVal: String?) { val request EnableKeyRequest { keyId keyIdVal } KmsClient.fromEnvironment { region us-west-2 }.use { kmsClient - kmsClient.enableKey(request) println($keyIdVal was successfully enabled.) } }在测试套件中这两个动作被编排为连续的测试步骤第 3 步禁用、第 4 步重新启用见 KMSKotlinTest.kt用于验证密钥状态的完整切换。4.4 列出密钥ListKeysListKeys.kt 演示如何分页列出账户下的密钥并打印每个密钥的 ARN 与 IDsuspend fun listAllKeys() { val request ListKeysRequest { limit 15 } KmsClient.fromEnvironment { region us-west-2 }.use { kmsClient - val response kmsClient.listKeys(request) response.keys?.forEach { key - println(The key ARN is ${key.keyArn}) println(The key Id is ${key.keyId}) } } }limit 15用于控制单次返回的密钥数量response.keys为列表集合通过 Kotlin 的forEach遍历输出每个密钥的keyArn与keyId。5. 数据加密与解密Encrypt / DecryptEncryptDataKey.kt 是目录中唯一同时演示加密与解密的文件main函数在加密成功后立即使用同一密钥解密val keyId args[0] val encryptedData encryptData(keyId) decryptData(encryptedData, keyId)加密函数suspend fun encryptData(keyIdValue: String): ByteArray? { val text This is the text to encrypt by using the AWS KMS Service val myBytes: ByteArray text.toByteArray() val encryptRequest EncryptRequest { keyId keyIdValue plaintext myBytes } KmsClient.fromEnvironment { region us-west-2 }.use { kmsClient - val response kmsClient.encrypt(encryptRequest) val algorithm: String response.encryptionAlgorithm.toString() println(The encryption algorithm is $algorithm) // Return the encrypted data. return response.ciphertextBlob } }要点明文以ByteArray形式通过plaintext字段传入返回值ciphertextBlob是加密后的二进制数据ByteArray?可安全存储或传输响应中的encryptionAlgorithm会打印出实际使用的加密算法。解密函数suspend fun decryptData( encryptedDataVal: ByteArray?, keyIdVal: String?, ) { val decryptRequest DecryptRequest { ciphertextBlob encryptedDataVal keyId keyIdVal } KmsClient { region us-west-2 }.use { kmsClient - val decryptResponse kmsClient.decrypt(decryptRequest) val myVal decryptResponse.plaintext // Print the decrypted data. print(myVal) } }解密时传入密文ciphertextBlob与密钥keyId返回的plaintext即为恢复的明文字节数组。测试第 2 步KMSKotlinTest.kt同样验证了这一加密-解密闭环流程。6. 别名管理Alias别名alias为 KMS 密钥提供稳定、易记忆的名称形如alias/myAlias可在密钥轮换或更换时保持调用方代码不变。仓库提供创建、列出、删除三个动作。6.1 创建别名CreateAliasCreateAlias.kt 的main函数接受两个命令行参数并打印用法说明Usage: targetKeyId aliasName Where: targetKeyId - The key ID or the Amazon Resource Name (ARN) of the KMS key. aliasName - An alias name to create (for example, alias/myAlias).核心函数suspend fun createCustomAlias( targetKeyIdVal: String?, aliasNameVal: String?, ) { val request CreateAliasRequest { aliasName aliasNameVal targetKeyId targetKeyIdVal } KmsClient.fromEnvironment { region us-west-2 }.use { kmsClient - kmsClient.createAlias(request) println($aliasNameVal was successfully created) } }CreateAliasRequest只需指定aliasName必须符合alias/前缀规范与targetKeyId密钥 ID 或 ARN。6.2 列出别名ListAliasesListAliases.kt 分页列出别名并打印每个别名名称suspend fun listAllAliases() { val request ListAliasesRequest { limit 15 } KmsClient.fromEnvironment { region us-west-2 }.use { kmsClient - val response kmsClient.listAliases(request) response.aliases?.forEach { alias - println(The alias name is ${alias.aliasName}) } } }6.3 删除别名DeleteAliasDeleteAlias.kt 属于 README 中「Custom Examples」补充列出的示例接受一个aliasName参数如alias/myAlias并调用DeleteAliasRequest删除指定别名suspend fun deleteSpecificAlias(aliasNameVal: String?) { val request DeleteAliasRequest { aliasName aliasNameVal } KmsClient.fromEnvironment { region us-west-2 }.use { kmsClient - kmsClient.deleteAlias(request) println($aliasNameVal was deleted.) } }7. 授权管理GrantGrant 用于向指定主体principal授予对 KMS 密钥执行特定操作的权限无需修改密钥策略适合需要精细控制临时访问的场景。7.1 创建授权CreateGrantCreateGrant.kt 的用法说明如下Usage: keyId granteePrincipal operation Where: keyId - The unique identifier for the AWS KMS key that the grant applies to (for example, xxxxxbcd-12ab-34cd-56ef-1234567890ab). granteePrincipal - The principal that is given permission to perform the operations that the grant permits. operation - An operation (for example, Encrypt).核心函数将字符串操作名转换为GrantOperation枚举并构造请求suspend fun createNewGrant( keyIdVal: String?, granteePrincipalVal: String?, operation: String, ): String? { val operationOb GrantOperation.fromValue(operation) val grantOperationList ArrayListGrantOperation() grantOperationList.add(operationOb) val request CreateGrantRequest { keyId keyIdVal granteePrincipal granteePrincipalVal operations grantOperationList } KmsClient.fromEnvironment { region us-west-2 }.use { kmsClient - val response kmsClient.createGrant(request) return response.grantId } }说明granteePrincipal是被授予权限的主体标识operations是GrantOperation列表示例中的GrantOperation.fromValue(Encrypt)表明支持以字符串方式映射操作类型返回的grantId是本次授权的唯一标识用于后续查询与撤销。7.2 列出授权ListGrantsListGrants.kt 针对指定密钥列出其全部授权并打印grantIdsuspend fun displayGrantIds(keyIdVal: String?) { val request ListGrantsRequest { keyId keyIdVal limit 15 } KmsClient.fromEnvironment { region us-west-2 }.use { kmsClient - val response kmsClient.listGrants(request) response.grants?.forEach { grant - println(The grant Id is ${grant.grantId}) } } }7.3 撤销授权RevokeGrantRevokeGrant.kt 同样是 README「Custom Examples」补充列出的示例接受keyId与grantId两个参数suspend fun revokeKeyGrant( keyIdVal: String?, grantIdVal: String?, ) { val request RevokeGrantRequest { keyId keyIdVal grantId grantIdVal } KmsClient.fromEnvironment { region us-west-2 }.use { kmsClient - kmsClient.revokeGrant(request) println($grantIdVal was successfully revoked.) } }8. 运行示例与参数约定8.1 命令行运行所有示例都是可独立运行的 Kotlin 程序含suspend fun main运行前需确保凭证与环境变量已配置。各程序通过main(args: ArrayString)解析命令行参数参数不足时打印usage提示并调用exitProcess(0)退出。各示例参数汇总如下示例参数个数参数含义CreateCustomerKey.kt0无参数描述文本硬编码DescribeKey.kt1keyId待描述的密钥 IDDisableCustomerKey.kt1keyId待禁用的密钥 IDEnableCustomerKey.kt1keyId待启用的密钥 IDListKeys.kt0无参数默认列出 15 个密钥EncryptDataKey.kt1keyId用于加解密的密钥 IDCreateAlias.kt2targetKeyId、aliasNameDeleteAlias.kt1aliasName待删除的别名ListAliases.kt0无参数默认列出 15 个别名CreateGrant.kt3keyId、granteePrincipal、operationRevokeGrant.kt2keyId、grantIdListGrants.kt1keyId查询授权的密钥 ID8.2 测试运行仓库提供完整的单元测试套件 KMSKotlinTest.kt位于src/test/kotlin/目录。测试采用 JUnit 5 框架TestInstance(TestInstance.Lifecycle.PER_CLASS)与TestMethodOrder(MethodOrderer.OrderAnnotation::class)保证测试按Order注解顺序执行形成一条完整的密钥生命周期流水线测试第 112 步依次执行创建密钥 → 加密/解密 → 禁用 → 启用 → 创建授权 → 列出授权 → 撤销授权 → 描述密钥 → 创建别名 → 列出别名 → 删除别名 → 列出密钥测试所需的keyDesc、operation、aliasName、granteePrincipal等参数通过 AWS Secrets Manager 中的test/kms密钥读取getSecretValues()方法使用SecretsManagerClient拉取 JSON 后用 Gson 反序列化测试第 1 步与第 5 步分别通过Assertions.assertTrue(!keyId.isEmpty())与Assertions.assertTrue(!grantId.isEmpty())校验创建结果非空。⚠ 运行测试同样可能在 AWS 账户中产生费用。完整的测试运行说明请参见 kotlin/README.md 的Tests一节。9. 学习要点与延伸从仓库源码可以归纳出 SDK for Kotlin 使用 KMS 的几个关键实践统一客户端模式所有操作都以KmsClient.fromEnvironment { region us-west-2 }创建客户端并在use块内完成调用保证资源自动释放这是官方示例的标准写法。请求对象以构造块初始化Kotlin SDK 的请求类如CreateKeyRequest、EncryptRequest均通过带接收者的构造块初始化字段直接以属性赋值代码简洁且类型安全。枚举与字符串互转涉及枚举字段如KeyUsageType、GrantOperation时可使用fromValue从字符串映射也可直接引用枚举常量。命令式入口与参数校验每个可独立运行的程序都在main中打印用法说明、校验参数个数兼顾了文档示例与实战可执行性。若要深入理解底层 API 行为可结合以下资源继续阅读kotlin/services/kms/README.md本示例的原始文档kotlin/README.mdKotlin 目录总览包含前置条件与测试运行说明AWS KMS Developer Guide 与 AWS KMS API ReferenceSDK for Kotlin AWS KMS referenceKotlin SDK 的 KMS API 参考文档。以上示例代码遵循 Apache-2.0 许可见各源文件头部的 SPDX 声明可以直接作为在 AWS SDK for Kotlin 项目中集成 KMS 加解密能力的起点。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐AWS SDK for Go 实战指南使用 AWS KMS 实现密钥创建、加密、解密与再加密AWS SDK for Go 实战指南使用 AWS KMS 实现密钥创建、加密、解密与再加密 本指南以 go/kms https://link.gitcode示例工程教程后端使用 AWS SDK for .NET 操作 AWS KMS密钥、别名与授权管理完整实战指南使用 AWS SDK for .NET 操作 AWS KMS密钥、别名与授权管理完整实战指南 导读 本文基于开源仓库 aws doc sdk examples示例工程教程后端AWS SDK for Java v2密钥管理KMS加密与解密操作AWS SDK for Java v2密钥管理KMS加密与解密操作 引言 在现代应用开发中数据安全是至关重要的考虑因素。AWS Key Management后端上一篇征辰科技 AI Camera 4GESP32-S3 ML307接入 xiaozhi-esp32编译烧录、硬件架构与 MCP 工具实战解析下一篇SRS 生态中的 httphead轻量 HTTP 头部解析库的源码剖析与实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表