# alibabacloud-encryption-sdk-java
**Repository Path**: aliyun/alibabacloud-encryption-sdk-java
## Basic Information
- **Project Name**: alibabacloud-encryption-sdk-java
- **Description**: alibabacloud-encryption-java-sdk
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-05-08
- **Last Updated**: 2025-08-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[English](README.md) | 简体中文

## AlibabaCloud Encryption SDK for Java
阿里云加密软件工具开发包(AlibabaCloud Encryption SDK)是一个客户端密码库,通过与阿里云[密钥管理服务(KMS)](https://www.aliyun.com/product/kms)相结合,可以帮助用户快速实现数据的加解密、签名验签功能。
借助AlibabaCloud Encryption SDK和密钥管理服务(KMS),您可以专注于数据加解密、电子签名验签等业务功能,无需花费大量成本来保障密钥的保密性、完整性和可用性。
阿里云Encryption SDK具有以下功能:
- 数据加解密、签名验签功能
- 借助阿里云KMS生成和保护数据密钥
- 自定义的加密数据格式
通过阿里云Encryption SDK,定一个DataKeyProvider,设置相应的KMS 用户主密钥(CMK),就可以对数据进行加解密操作。
### 加密流程
1. 通过KMS控制台,或者调用[CreateKey](https://help.aliyun.com/document_detail/28947.html)接口,创建一个用户主密钥;
2. 创建DataKeyProvider,设置主密钥ARN;
3. 调用encrypt接口进行加密,加密过程中,会通过[DefaultDataKeyProvider](https://github.com/aliyun/alibabacloud-encryption-sdk-java/src/main/java/com/aliyun/encryptionsdk/provider/dataKey/DefaultDataKeyProvider.java)调用KMS的[GenerateDataKey](https://help.aliyun.com/document_detail/28948.html)接口创建一个数据密钥,得到数据密钥后对数据进行加密;
#### 加密结果消息格式
加密结果包含头部和消息体,使用ASN.1编码。消息头部包含加密上下文(Encryption Context)和数据密钥密文等信息,消息体包含IV、密文、和认证信息三部分。
```asn1
EncryptionMessage ::== SEQUENCE {
encryptionHead EncryptionHead --加密消息头
encryptionBody EncryptionBody --加密消息体
}
EncryptionHead ::== SEQUENCE {
version INTEGER --版本
algorithm INTEGER --算法
encryptedDataKeys SET EncryptedDataKey --DataKey加密集合
encryptionContext SET EncryptionContext --加密上下文
headerIv OCTECT STRING --头部认证向量
headerAuthTag OCTECT STRING --头部认证信息
}
EncryptionBody ::== SEQUENCE{
iv OCTECT STRING --初始向量
cipherText OCTECT STRING --密文
authTag OCTECT STRING --GCM认证信息
}
```
### 数据签名验签
数据签名验签基于公钥密码技术,通过签名者拥有的私钥对数据进行签名,验签者使用公钥对签名信息进行验证。数字签名机制作为保障网络信息安全的手段之一,可以解决伪造、抵赖、冒充和篡改问题。
阿里云Encryption SDK的签名功能基于阿里云密钥管理服务(KMS)的签名服务。使用时,在阿里云KMS创建一个用于签名验签功能的[非对称用户主密钥(CMK)](https://help.aliyun.com/document_detail/148147.html),在[KmsAsymmetricKeyProvider](https://github.com/aliyun/alibabacloud-encryption-sdk-java/src/main/java/com/aliyun/encryptionsdk/provider/KmsAsymmetricKeyProvider.java)中指定用户主密钥的KeyId和KeyVersionId,调用阿里云Encryption SDK提供的sign接口,可实现数据的签名功能。
### 构建
```shell
$ git clone https://github.com/aliyun/alibabacloud-encryption-sdk-java.git
$ cd alibabacloud-encryption-sdk-java
$ mvn package -DskipTests
```
### Maven依赖
```xml
com.aliyun
alibabacloud-encryption-sdk-java
1.1.0
```
### 代码示例
#### 1. 共享kms示例
```java
public class BasicEncryptionExample {
private static final String ACCESS_KEY_ID = System.getenv("");
private static final String ACCESS_KEY_SECRET = System.getenv("");
private static final String CMK_ARN = "acs:kms:RegionId:UserId:key/CmkId";
private static final byte[] PLAIN_TEXT = "Hello World".getBytes(StandardCharsets.UTF_8);
private static final List CMK_ARN_LIST;
static {
CMK_ARN_LIST = new ArrayList<>();
CMK_ARN_LIST.add("cmk1");
CMK_ARN_LIST.add("cmk2");
}
public static void main(String[] args) {
// 1. 创建访问共享kms配置
AliyunConfig config = new AliyunConfig();
config.withAccessKey(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
//1. 创建可访问专属kms配置
//AliyunConfig config = new AliyunKmsConfig();
//config.withAccessKey(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
//config.addConfig(new Config().setRegionId("regionId").setClientKeyFile("clientKeyFile").setPassword("password").setEndpoint("endpoint").setProtocol("protocol"));
// 2. 创建SDK,传入访问aliyun配置
AliyunCrypto aliyunSDK = new AliyunCrypto(config);
// 设置缓存ckm(可设置,默认为DefaultCryptoKeyManager)
//aliyunSDK.setCryptoKeyManager(new CachingCryptoKeyManager(new LocalDataKeyMaterialCache()));
// 3. 创建provider,用于提供数据密钥或签名
BaseDataKeyProvider provider = new DefaultDataKeyProvider(CMK_ARN);
// 设置不同的算法(可设置,默认为AES_GCM_NOPADDING_256)
//provider.setAlgorithm(CryptoAlgorithm.SM4_GCM_NOPADDING_128);
// 设置多CMK(可设置,默认为单CMK)
//provider.setMultiCmkId(CMK_ARN_LIST);
// 创建不同的provider
//BaseDataKeyProvider provider = new SecretManagerDataKeyProvider(CMK_ID, "dataKeySecretName");
// 4. 加密上下文
Map encryptionContext = new HashMap<>();
encryptionContext.put("one", "one");
encryptionContext.put("two", "two");
// 5. 调用加密接口
CryptoResult cipherResult = aliyunSDK.encrypt(provider, PLAIN_TEXT, encryptionContext);
CryptoResult plainResult = aliyunSDK.decrypt(provider, cipherResult.getResult());
Assert.assertArrayEquals(PLAIN_TEXT, plainResult.getResult());
}
}
```
#### 2. 专属kms示例
```java
import com.aliyun.dkms.gcs.openapi.models.Config;
import com.aliyun.encryptionsdk.model.CryptoResult;
import com.aliyun.encryptionsdk.model.DkmsConfig;
import com.aliyun.encryptionsdk.provider.BaseDataKeyProvider;
import com.aliyun.encryptionsdk.provider.dataKey.DefaultDataKeyProvider;
import org.junit.Assert;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BasicEncryptionExample {
private static final String ACCESS_KEY_ID = System.getenv("");
private static final String ACCESS_KEY_SECRET = System.getenv("");
private static final String CMK_ARN = "acs:kms:RegionId:UserId:key/CmkId";
private static final byte[] PLAIN_TEXT = "Hello World".getBytes(StandardCharsets.UTF_8);
private static final List CMK_ARN_LIST;
static {
CMK_ARN_LIST = new ArrayList<>();
CMK_ARN_LIST.add("cmk1");
CMK_ARN_LIST.add("cmk2");
}
public static void main(String[] args) {
//1. 创建可访问专属kms配置
AliyunKmsConfig config = new AliyunKmsConfig();
config.withAccessKey(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
config.addDkmsConfig(new DkmsConfig(
new Config()
.setRegionId("")
.setClientKeyFile("")
.setPassword("")
.setEndpoint("")
.setProtocol("")
, false));
// 2. 创建SDK,传入访问aliyun配置
AliyunCrypto aliyunSDK = new AliyunCrypto(config);
// 设置缓存ckm(可设置,默认为DefaultCryptoKeyManager)
//aliyunSDK.setCryptoKeyManager(new CachingCryptoKeyManager(new LocalDataKeyMaterialCache()));
// 3. 创建provider,用于提供数据密钥或签名
BaseDataKeyProvider provider = new DefaultDataKeyProvider(CMK_ARN);
// 设置不同的算法(可设置,默认为AES_GCM_NOPADDING_256)
//provider.setAlgorithm(CryptoAlgorithm.SM4_GCM_NOPADDING_128);
// 设置多CMK(可设置,默认为单CMK)
//provider.setMultiCmkId(CMK_ARN_LIST);
// 创建不同的provider
//BaseDataKeyProvider provider = new SecretManagerDataKeyProvider(CMK_ID, "dataKeySecretName");
// 4. 加密上下文
Map encryptionContext = new HashMap<>();
encryptionContext.put("one", "one");
encryptionContext.put("two", "two");
// 5. 调用加密接口
CryptoResult cipherResult = aliyunSDK.encrypt(provider, PLAIN_TEXT, encryptionContext);
CryptoResult plainResult = aliyunSDK.decrypt(provider, cipherResult.getResult());
Assert.assertArrayEquals(PLAIN_TEXT, plainResult.getResult());
}
}
```