Java常用工具算法-6--秘钥托管云服务AWS KMS

news2025/4/19 6:10:31

前言:

之前我们介绍了一些常用的加密算法(如:对称加密AES,非对称加密RSA,ECC等),不论是哪一种都需要涉及到秘钥的管理。通常的做法都是把秘钥放到配置文件中进行配置,但是对于一些高度需要安全保证的场景来说,这样并不是安全的,容易造成秘钥泄漏,进而造成数据被破解。所以这个时候我们就需要借助一些相对安全的机制去管理秘钥,例如:亚马逊的AWS KMS,或Azure Key Vault等。本篇介绍下AWS KMS。

1、为什么不能简单将密钥放在系统配置中?

(1)、明文存储风险

  • 系统配置文件(如 .envconfig.properties)通常以明文形式存储密钥,一旦被非法访问(如代码泄露、服务器入侵),密钥将直接暴露,导致数据被窃取或篡改。

(2)、缺乏生命周期管理

  • 系统配置中的密钥通常静态不变,无法自动更新或销毁,长期使用会增加被破解的风险(如穷举攻击)。

(3)、权限控制不足

  • 配置文件的访问权限可能未严格限制,导致非授权人员或系统可直接读取密钥。

(4)、无法应对复杂场景

  • 多环境(开发/测试/生产)、多服务(如微服务架构)的密钥分发和管理会变得混乱,难以追踪和审计。

2、密钥管理的核心好处

(1)、提升安全性

  • 安全存储:
    密钥存储在硬件安全模块(HSM)或加密的密钥管理系统(如Azure Key Vault、AWS KMS),而非明文文件中。

  • 防止泄露:
    通过访问控制(如RBAC)、最小权限原则和审计日志,确保只有授权方能访问密钥。

  • 抵御攻击:
    密钥轮换(定期更换密钥)和分层保护(如主密钥保护会话密钥)降低泄露风险。

(2)、符合合规要求

  • 行业标准:
    密钥管理需符合GDPR、PCI DSS等法规,直接存放配置文件可能违反合规性要求。

(3)、简化运维与自动化

  • 集中化管理:
    通过密钥管理系统(如HashiCorp Vault、AWS KMS)统一管理所有密钥,支持多环境和多服务。

  • 自动化生命周期:
    自动轮换密钥、设置有效期、销毁旧密钥,减少人为操作错误。

(4)、支持复杂场景

  • 动态分发:
    通过安全协议(如TLS)分发密钥,支持云原生、微服务等分布式架构。

  • 审计与追溯:
    记录密钥的使用、访问和变更日志,便于追踪异常行为。

(5)、降低业务风险

  • 避免数据泄露损失:
    密钥泄露可能导致数据泄露,进而引发法律纠纷和经济损失(如平均泄露成本达488万美元)。

3、密钥管理 vs 直接存放配置的对比

在这里插入图片描述

4、AWS KMS简介

AWS KMS(Key Management Service,密钥管理服务)是亚马逊云(AWS)提供的一项‌全托管服务‌,用于简化加密密钥的创建、存储和管理,帮助用户轻松实现数据的加密保护。

  • 密钥管理‌

    • 密钥类型‌:支持对称密钥(AES-256)和非对称密钥(RSA/ECC)。
    • 生命周期管理‌:创建、启用/禁用、轮换(自动或手动)、删除密钥。
  • 密钥分类‌:

    • 客户主密钥(CMK)‌:用户自定义密钥,完全控制权限和策略。
    • AWS托管密钥‌:AWS自动生成并管理的密钥(如S3默认加密密钥)。
  • 加密服务‌

    • 集成加密‌:与AWS服务(S3、RDS、EBS等)无缝集成,自动加密存储的数据。
    • API调用‌:通过AWS SDK直接调用加密/解密接口,保护应用程序数据。
  • 安全性‌

    • 硬件安全模块(HSM)‌:密钥存储在通过FIPS 140-2/3认证的HSM中,确保物理隔离。
    • 访问控制‌:通过IAM策略和密钥策略,精细化控制“谁能在什么条件下使用密钥”。

5、亚马逊云平台基本配置

(1)、创建 AWS 账户

  • 如果还没有 AWS 账户,请前往 AWS 官网 注册一个账户。

(2)、创建 KMS 密钥

  • 登录 AWS 管理控制台。
  • 在服务列表中搜索并选择 KMS (Key Management Service)。
  • 单击 Create key 按钮。
  • 选择密钥类型(如对称密钥或非对称密钥),然后按照向导完成密钥的创建。
  • 记下密钥的 ARN(Amazon Resource Name),例如:
 arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-abcd-1234abcd5678

(4)、配置 IAM 权限

  • 创建一个 IAM 用户或角色,并赋予其访问 KMS 的权限。
  • 在 IAM 控制台中,为用户或角色附加以下策略:
    json示例:
 {
   "Version": "2012-10-17",
   "Statement": [
     {
       "Effect": "Allow",
       "Action": [
         "kms:Encrypt",
         "kms:Decrypt",
         "kms:GenerateDataKey"
       ],
       "Resource": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-abcd-1234abcd5678"
     }
   ]
 }

(4)、获取访问凭证

  • 在 IAM 控制台中,获取该用户的访问密钥(Access Key ID 和 Secret Access Key)。
  • 将这些凭证存储到本地环境变量中,或者使用 AWS CLI 配置凭证。

6、Spring Boot 项目代码示例

(1)、添加依赖

在 pom.xml 中添加 Spring Cloud AWS KMS 依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-aws-autoconfigure</artifactId>
    <version>2.4.0</version> <!-- 确保版本与 Spring Boot 兼容 -->
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-aws</artifactId>
    <version>2.4.0</version>
</dependency>

(2)、配置 application.properties

在项目 src/main/resources 目录下配置 AWS 凭据和 KMS 参数:
properties示例:

# AWS 全局配置
cloud.aws.credentials.access-key=YOUR_ACCESS_KEY_ID
cloud.aws.credentials.secret-key=YOUR_SECRET_ACCESS_KEY
cloud.aws.region.static=us-east-1

# KMS 配置
cloud.aws.kms.key-id=arn:aws:kms:us-east-1:123456789012:key/abcd1234-a123-4567-8abc-def123456789

(3)、建 KMS 服务类

创建一个服务类 KmsService,使用 Spring Cloud AWS 提供的 KmsTemplate 进行加密和解密:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.aws.kms.AWSKmsMessageCrypto;
import org.springframework.cloud.aws.kms.AWSKmsMessageCryptoFactory;
import org.springframework.stereotype.Service;

@Service
public class KmsService {

    private final AWSKmsMessageCrypto crypto;

    public KmsService(AWSKmsMessageCryptoFactory cryptoFactory) {
        this.crypto = cryptoFactory.createCrypto();
    }

    // 加密方法
    public String encrypt(String plaintext) {
        try {
            byte[] encrypted = crypto.encrypt(plaintext.getBytes());
            return new String(encrypted);
        } catch (Exception e) {
            throw new RuntimeException("加密失败", e);
        }
    }

    // 解密方法
    public String decrypt(String ciphertext) {
        try {
            byte[] decrypted = crypto.decrypt(ciphertext.getBytes());
            return new String(decrypted);
        } catch (Exception e) {
            throw new RuntimeException("解密失败", e);
        }
    }
}

(4)、创建 REST 控制器

创建一个控制器 KmsController,提供加密和解密的 REST 接口:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/kms")
public class KmsController {

    @Autowired
    private KmsService kmsService;

    @PostMapping("/encrypt")
    public String encrypt(@RequestParam String text) {
        return kmsService.encrypt(text);
    }

    @PostMapping("/decrypt")
    public String decrypt(@RequestParam String ciphertext) {
        return kmsService.decrypt(ciphertext);
    }
}

逆风翻盘,Dare To Be!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2331646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11. Langchain输出解析(Output Parsers):从自由文本到结构化数据

引言&#xff1a;从"自由发挥"到"规整输出" 2025年某金融机构的合同分析系统升级前&#xff0c;AI生成的合同摘要需人工二次处理达47分钟/份。引入LangChain结构化解析后&#xff0c;处理时间缩短至3分钟。本文将详解如何用LangChain的解析器&#xff0c;…

python reportlab模块----操作PDF文件

reportlab模块----操作PDF文件 一. 安装模块二. reportlab相关介绍三. 扩展canvas类四. 水平写入完整代码五. 垂直写入完整代码 一. 安装模块 pip install reportlab二. reportlab相关介绍 # 1. letter 生成A4纸张尺寸 from reportlab.lib.pagesizes import letter print(let…

解锁基因密码之重测序(从测序到分析)

在生命科学的奇妙世界中&#xff0c;基因恰似一本记录着生命奥秘的“天书”&#xff0c;它承载着生物体生长、发育、衰老乃至疾病等一切生命现象的关键信息。而重测序技术&#xff0c;则是开启基因“天书”奥秘的一把神奇钥匙。 试想&#xff0c;你手中有一本经典书籍的通用版…

TQTT_KU5P开发板教程---QSFP25G光口回环测试

文档实现功能介绍 本文档通过一个叫做ibert的IP&#xff0c;实现25G光口回环测试例子。工程新建方法请参考文档《流水灯》&#xff0c;其中只是将文件名进行修改。 Vivado 起始页&#xff08;或 file-->Project-->New 创建新工程(Create New Project) 向导起始页面 点…

JVM虚拟机篇(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解

JVM垃圾回收器全面解析与G1深度探秘及四种引用详解 JVM虚拟机&#xff08;七&#xff09;&#xff1a;JVM垃圾回收器全面解析与G1深度探秘及四种引用详解一、JVM有哪些垃圾回收器1. Serial回收器2. ParNew回收器3. Parallel Scavenge回收器4. Serial Old回收器5. Parallel Old回…

柑橘病虫害图像分类数据集OrangeFruitDaatset-8600

文章目录 1. 前言2. 数据类别介绍3. 数据集地址 1. 前言 柑橘&#xff0c;作为水果界的 “宠儿”&#xff0c;不仅以其酸甜可口的味道深受大众喜爱&#xff0c;更是在全球水果产业中占据着举足轻重的地位。无论是早餐中的一杯橙汁&#xff0c;还是下午茶里的柑橘甜点&#xff…

深度学习总结(4)

张量积 张量积&#xff08;tensor product&#xff09;或点积&#xff08;dot product&#xff09;是最常见且最有用的张量运算之一。注意&#xff0c;不要将其与逐元素乘积&#xff08;*运算符&#xff09;弄混。在NumPy中&#xff0c;使用np.dot函数来实现张量积&#xff0c…

利用CST Microwave Studio设计贴片天线

利用CST Microwave Studio设计贴片天线的步骤如下&#xff0c;分为几个关键阶段&#xff1a; --- ### **1. 初始设置** - **新建项目**&#xff1a;打开CST&#xff0c;创建新项目&#xff08;File > New&#xff09;&#xff0c;选择“Antenna (Planar)”或“Microwave &…

STM32之SG90舵机控制(附视频讲解)

目录 前言&#xff1a; 一、硬件准备与接线 1.1 硬件清单 1.2 接线 二、 SG90舵机简介 1.1 外观 1.2 基本参数 1.3 引脚说明 1.4 控制原理 1.5 特点 1.6 常见问题 三、 单片机简介 四、 程序设计 4.1 定时器配置 4.2 角度控制函数 4.3 主函数调用 五、 总结 …

(1)英特尔 RealSense T265(三)

文章目录 前言 4.4 地面测试 4.5 飞行测试 4.6 室内外实验 4.7 数据闪存记录 4.8 启动时自动运行 4.9 使用 OpticalFlow 进行 EKF3 光源转换 前言 Realsense T265 通过 librealsense 支持 Windows 和 Linux 系统。不同系统的安装过程差异很大&#xff0c;因此请参阅 gi…

多模态大语言模型arxiv论文略读(七)

MLLM-DataEngine: An Iterative Refinement Approach for MLLM ➡️ 论文标题&#xff1a;MLLM-DataEngine: An Iterative Refinement Approach for MLLM ➡️ 论文作者&#xff1a;Zhiyuan Zhao, Linke Ouyang, Bin Wang, Siyuan Huang, Pan Zhang, Xiaoyi Dong, Jiaqi Wang,…

SQL ③-基本语法

SQL基本语法 表操作 创建表 CREATE TABLE table_name (column1 datatype constraint,column2 datatype constraint,column3 datatype constraint,... );删除表 DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name...];TEMPORARY&#xff1a;表示临时表&#xff…

esp32cam -> 服务器 | 手机 -> 服务器 直接服务器传输图片

服务器先下载python &#xff1a; 一、Python环境搭建&#xff08;CentOS/Ubuntu通用&#xff09; 一条一条执行 安装基础依赖 # CentOS sudo yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel # Ubuntu sudo apt update && sudo apt install b…

豆浆机语音提示芯片方案:基于可远程在线更换语音的WT2003H-16S芯片

随着智能家居概念的普及&#xff0c;消费者对家电产品的智能化、便捷性提出了更高要求。豆浆机作为厨房常用电器&#xff0c;其操作便捷性和用户体验直接影响市场竞争力。传统豆浆机多依赖指示灯或简单蜂鸣器提示用户操作状态&#xff0c;信息传递单一且无法满足个性化需求。 在…

解密工业控制柜:认识关键硬件(PLC)

前言 作为一名视觉开发工程师&#xff0c;我们不仅要做到做好自己的工作&#xff0c;我们更需要在工业现场学习更多知识&#xff0c;最近网上流传很多&#xff0c;“教会徒弟&#xff0c;饿死师傅”&#xff1b;在自动化行业中&#xff0c;在项目下来很忙的时候&#xff0c;我们…

【嵌入式系统设计师】知识点:第11 章 嵌入式系统设计案例分析

提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…

【深度解析】SkyWalking 10.2.0版本安全优化与性能提升实战指南

前言 Apache SkyWalking 作为云原生可观测性领域的佼佼者&#xff0c;在微服务架构监控中扮演着至关重要的角色。然而&#xff0c;官方版本在安全性、镜像体积和功能扩展方面仍有优化空间。本文将分享一套完整的 SkyWalking 10.2.0 版本优化方案&#xff0c;从安全漏洞修复到镜…

面向大模型的开发框架LangChain

这篇文章会带给你 如何使用 LangChain&#xff1a;一套在大模型能力上封装的工具框架如何用几行代码实现一个复杂的 AI 应用面向大模型的流程开发的过程抽象 文章目录 这篇文章会带给你写在前面LangChain 的核心组件文档&#xff08;以 Python 版为例&#xff09;模型 I/O 封装…

Easysearch VS Opensearch 数据写入与存储性能对比

本文记录 Easysearch 和 Opensearch 数据写入和数据存储方面的性能对比。 准备 压测工具&#xff1a;INFINI Loadgen 对比版本&#xff1a; Easysearch 1.11.1&#xff08;lucene 8.11.4&#xff09;Opensearch 2.19.1&#xff08;lucene 9.12.1&#xff09; 节点 JVM 配置…

【Proteus仿真】【32单片机-A009】矩阵按键系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、按键值与LCD显示 2、矩阵按键 二、使用步骤 系统运行后&#xff0c;LCD1602显示当前的按键值&#xff1b; 当按下不同按键后显示屏更新对应的按键值。 三、硬件资…