使用阿里云KMS产品针对 Springboot 接口参数加密解密功能

简介: 针对Springboot里面使用开源工具使用加解密,替换成阿里云KMS产品进行加解密;


1.开发加解密 starter

为了让我们开发的这个工具更加通用,也为了复习一下自定义 Spring Boot Starter,这里我们就将这个工具做成一个 stater,以后在 Spring Boot 项目中直接引用就可以。

首先我们创建一个 Spring Boot 项目,引入 spring-boot-starter-web 依赖:

复制

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <scope>provided</scope>
    <version>2.4.3</version>
</dependency>• 1.

因为我们这个工具是为 Web 项目开发的,以后必然使用在 Web 环境中,所以这里添加依赖时 scope 设置为 provided。

依赖添加完成后,我们先来定义一个加密工具类备用,加密这块有多种方案可以选择,对称加密、非对称加密,其中对称加密又可以使用 AES、DES、3DES 等不同算法,这里我们使用阿里云的KMS产品中的密钥进行加密;


2.启动阿里云KMS产品,创建AES算法的key


2.1 创建KMS产品实例:

image.png

2.2 创建之后,启动KMS产品实例, 该产品为双AZ架构,进一步提升的稳定性,需要选择业务需要在的双可用区和自己在阿里云上的VPC,点击立即启动;


image.png

2.3 启动之后,创建需要的密钥;需要创建AES的密码算法的密钥,该密钥支持轮转的能力,将会按照自定义的轮转周期进行更新密钥,进一步提升密钥的安全性; 相比Springboot提供的开源加密密钥安全性有保障; 既然用密钥就是为了安全,门钥匙一定是安全的。


image.png


2.4 初始化KMS的sdk

2.4.1 初始化KMS的SDK,安装SDK依赖;

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>alibabacloud-dkms-gcs-sdk</artifactId>
    <version>0.5.2</version>
</dependency>

2.4.2 初始化kms client

package aesUtils;
import com.aliyun.dkms.gcs.openapi.models.Config;
import com.aliyun.dkms.gcs.sdk.Client;
public class InitKmsClient {
    public Client  InitKmsClient(String protocol,String endpoint,String clientKey,String clientKeyPass,String KmsCacert) throws Exception {
        Client client = new Client(new Config().setProtocol(protocol).setEndpoint(endpoint).setCaFilePath(clientKey).setClientKeyFile(clientKey).setPassword(clientKeyPass));
        return client;
    }

}

2.5 使用Kms AES对称算法密钥对数据加解密

package aesUtils;
import com.aliyun.dkms.gcs.sdk.Client;
import com.aliyun.dkms.gcs.sdk.models.*;
import java.nio.charset.StandardCharsets;
public class KmsAesEncUtils {
    //使用Kms AES对称算法密钥加密数据
    public byte[] kmsAesAdvEncrypt(Client kmsClient,String keyId,String plaintext) throws Exception{
        AdvanceEncryptRequest request = new AdvanceEncryptRequest();
        request.setKeyId(keyId); // 调用KMS创建的key的名称;
        request.setPlaintext(plaintext.getBytes(StandardCharsets.UTF_8));
        // 调用高级加密接口进行加密
        // 如需忽略服务端证书,可使用此处注释代码方式调用
        //RuntimeOptions runtimeOptions = new RuntimeOptions();
        //runtimeOptions.setIgnoreSSL(true);
        //AdvanceEncryptResponse response = client.advanceEncryptWithOptions(request, runtimeOptions);
        AdvanceEncryptResponse response = kmsClient.advanceEncrypt(request);
        byte[] cipherbolb=response.getCiphertextBlob();
        return cipherbolb;
    }

    //使用Kms AES对称算法密钥加密数据
    public String kmsAesAdvDecrypt(Client kmsClient,byte[] cipherbolb)  throws Exception {
        AdvanceDecryptRequest request = new AdvanceDecryptRequest();
        // 调用高级解密接口进行解密
        // 如需忽略服务端证书,可使用此处注释代码方式调用
        //RuntimeOptions runtimeOptions = new RuntimeOptions();
        //runtimeOptions.setIgnoreSSL(true);
        //AdvanceDecryptResponse response = client.advanceDecryptWithOptions(request, runtimeOptions);
        request.setCiphertextBlob(cipherbolb);
        AdvanceDecryptResponse response = kmsClient.advanceDecrypt(request);
        return new String(response.getPlaintext());
    }
}


3.将加密接口发布的线上;

3.1 发布到线上

可以使用JitPack 进行线上发布。

首先我们在 GitHub 上创建一个仓库,将我们的代码上传上去,这个过程应该不用我多说吧。

上传成功后,点击右边的 Create a new release 按钮,发布一个正式版,至此,我们的工具就已经成功发布了!小伙伴们可以通过如下方式引用这个 starter:


3.2 直接应用到项目

通过创建 Spring Boot的web项目,引入 starter 依赖,即可完成。


参考文献:

【1】https://developer.aliyun.com/article/1436356

【2】如何初始化SDK以及如何调用接口进行加密解密、签名验签和获取凭据值_密钥管理服务(Key Management Service)-阿里云帮助中心


作者介绍
目录