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产品实例:
2.2 创建之后,启动KMS产品实例, 该产品为双AZ架构,进一步提升的稳定性,需要选择业务需要在的双可用区和自己在阿里云上的VPC,点击立即启动;
2.3 启动之后,创建需要的密钥;需要创建AES的密码算法的密钥,该密钥支持轮转的能力,将会按照自定义的轮转周期进行更新密钥,进一步提升密钥的安全性; 相比Springboot提供的开源加密密钥安全性有保障; 既然用密钥就是为了安全,门钥匙一定是安全的。
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)-阿里云帮助中心