如何使用KMS加密保护线下数据 加密和解密的API 您可以调用以下API,在本地对数据进行加解密。 API名称 说明 创建数据密钥 创建数据密钥。 解密数据密钥 用指定的主密钥解密数据密钥。 加密本地文件 步骤1 通过控制台,创建用户主密钥。 步骤2 请准备基础认证信息。 ACCESSKEY: 帐号Access Key SECRETACCESSKEY: 帐号Secret Access Key PROJECTID:项目ID KMSENDPOINT: KMS服务访问终端地址。 步骤3 加密本地文件。 示例代码中: 用户主密钥:控制台创建的密钥ID。 明文数据文件:FirstPlainFile.jpg。 输出的密文数据文件:SecondEncryptFile.jpg。 import com.ctyun.sdk.core.auth.BasicCredentials; import com.ctyun.sdk.kms.v1.KmsClient; import com.ctyun.sdk.kms.v1.model.CreateDatakeyRequest; import com.ctyun.sdk.kms.v1.model.CreateDatakeyRequestBody; import com.ctyun.sdk.kms.v1.model.CreateDatakeyResponse; import com.ctyun.sdk.kms.v1.model.DecryptDatakeyRequest; import com.ctyun.sdk.kms.v1.model.DecryptDatakeyRequestBody; import javax.crypto.Cipher; import javax.crypto.spec.GCMParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Files; import java.security.SecureRandom; / 使用数据密钥(DEK)进行文件加解密 激活assert语法,请在VMOPTIONS中添加ea / public class FileStreamEncryptionExample { private static final String ACCESSKEY " "; private static final String SECRETACCESSKEY " "; private static final String PROJECTID " "; private static final String KMSENDPOINT " "; // KMS服务接口版本信息,当前固定为v1.0 private static final String KMSINTERFACEVERSION "v1.0"; / AES算法相关标识: AESKEYBITLENGTH: AES256密钥比特长度 AESKEYBYTELENGTH: AES256密钥字节长度 AESALG: AES256算法,本例分组模式使用GCM,填充使用PKCS5Padding AESFLAG: AES算法标识 GCMTAGLENGTH: GCM TAG长度 GCMIVLENGTH: GCM 初始向量长度 / private static final String AESKEYBITLENGTH "256"; private static final String AESKEYBYTELENGTH "32"; private static final String AESALG "AES/GCM/PKCS5Padding"; private static final String AESFLAG "AES"; private static final int GCMTAGLENGTH 16; private static final int GCMIVLENGTH 12; public static void main(final String[] args) { // 您在控制台创建的用户主密钥ID final String keyId args[0]; encryptFile(keyId); } / 使用数据密钥加解密文件实例 @param keyId 用户主密钥ID / static void encryptFile(String keyId) { // 1.准备访问认证信息 final BasicCredentials auth new BasicCredentials().withAk(ACCESSKEY).withSk(SECRETACCESSKEY) .withProjectId(PROJECTID); // 2.初始化SDK,传入认证信息及KMS访问终端地址 final KmsClient kmsClient KmsClient.newBuilder().withCredential(auth).withEndpoint(KMSENDPOINT).build(); // 3.组装创建数据密钥请求信息 final CreateDatakeyRequest createDatakeyRequest new CreateDatakeyRequest().withVersionId(KMSINTERFACEVERSION) .withBody(new CreateDatakeyRequestBody().withKeyId(keyId).withDatakeyLength(AESKEYBITLENGTH)); // 4.创建数据密钥 final CreateDatakeyResponse createDatakeyResponse kmsClient.createDatakey(createDatakeyRequest); // 5.接收创建的数据密钥信息 // 密文密钥与KeyId建议保存在本地,方便解密数据时获取明文密钥 // 明文密钥在创建后立即使用,使用前需要将16进制明文密钥转换成byte数组 final String cipherText createDatakeyResponse.getCipherText(); final byte[] plainKey hexToBytes(createDatakeyResponse.getPlainText()); // 6.准备待加密的文件 // inFile 待加密的原文件 // outEncryptFile 加密后的文件 final File inFile new File("FirstPlainFile.jpg"); final File outEncryptFile new File("SecondEncryptFile.jpg"); // 7.使用AES算法进行加密时,可以创建初始向量 final byte[] iv new byte[GCMIVLENGTH]; final SecureRandom secureRandom new SecureRandom(); secureRandom.nextBytes(iv); // 8.对文件进行加密,并存储加密后的文件 doFileFinal(Cipher.ENCRYPTMODE, inFile, outEncryptFile, plainKey, iv); } / 对文件进行加解密 @param cipherMode 加密模式,可选值为Cipher.ENCRYPTMODE或者Cipher.DECRYPTMODE @param infile 待加解密的文件 @param outFile 加解密后的文件 @param keyPlain 明文密钥 @param iv 初始化向量 / static void doFileFinal(int cipherMode, File infile, File outFile, byte[] keyPlain, byte[] iv) { try (BufferedInputStream bis new BufferedInputStream(new FileInputStream(infile)); BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(outFile))) { final byte[] bytIn new byte[(int) infile.length()]; final int fileLength bis.read(bytIn); assert fileLength > 0; final SecretKeySpec secretKeySpec new SecretKeySpec(keyPlain, AESFLAG); final Cipher cipher Cipher.getInstance(AESALG); final GCMParameterSpec gcmParameterSpec new GCMParameterSpec(GCMTAGLENGTH Byte.SIZE, iv); cipher.init(cipherMode, secretKeySpec, gcmParameterSpec); final byte[] bytOut cipher.doFinal(bytIn); bos.write(bytOut); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } }