活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 一键部署Llama3大模型学习机 0代码一键部署,预装最新主流大模型Llama3与StableDiffusion
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      查看所有产品

      数据加密

      数据加密

        • 产品动态
        • 产品介绍
        • 产品定义
        • 密钥管理
        • 功能特性
        • 产品优势
        • 使用场景
        • 如何使用
        • 专属加密
        • 功能特性
        • 产品优势
        • 使用场景
        • 术语解释
        • 权限管理
        • 个人数据保护机制
        • 与其他云服务的关系
        • 快速入门
        • 使用密钥进行OBS服务端加密
        • 计费说明
        • 计费说明
        • 续订规则
        • 退订规则
        • 用户指南
        • 密钥管理
        • 密钥概述
        • 导入密钥
        • 概述
        • 删除密钥材料
        • 创建密钥
        • 管理密钥
        • 查看密钥
        • 启用密钥
        • 禁用密钥
        • 删除密钥
        • 取消删除密钥
        • 在线工具加解密小数据
        • 管理标签
        • 添加标签
        • 通过标签搜索自定义密钥
        • 修改标签值
        • 删除标签
        • 轮换密钥
        • 密钥轮换概述
        • 开启密钥轮换
        • 关闭密钥轮换
        • 使用密钥管理加密的云服务
        • OBS服务端加密
        • EVS服务端加密
        • IMS服务端加密
        • RDS服务端加密
        • DDS服务端加密
        • 专属加密
        • 操作指引
        • 创建专属加密实例
        • 查看专属加密实例
        • 使用专属加密实例
        • 权限管理
        • 创建用户并授权使用DEW
        • DEW自定义策略
        • 最佳实践
        • 如何使用KMS加密保护线下数据
        • 云服务使用KMS加解密数据
        • 常见问题
        • 计费类
        • 购买类
        • 密钥管理类
        • 什么是密钥管理?
        • 什么是用户主密钥?
        • 什么是默认主密钥?
        • 自定义密钥与默认主密钥有什么区别?
        • 什么是数据加密密钥?
        • 为什么不能立即删除用户主密钥?
        • 哪些云服务使用KMS加密数据?
        • 云服务如何使用KMS加密数据?
        • 信封加密方式有什么优势?
        • 在KMS中创建的用户主密钥的个数是否有限制?
        • 是否可以从KMS中导出用户主密钥?
        • 如果用户主密钥被彻底删除,用户数据是否还可以解密?
        • 如何使用在线工具加解密数据?
        • 是否可以更新KMS管理的密钥?
        • 在什么场景下推荐使用导入的密钥?
        • 密钥材料被意外删除时如何处理?
        • KMS支持的密钥算法类型
        • 调用encrypt-data接口,返回的密文和明文有什么关系?
        • 没有权限操作KMS,该如何处理?
        • 进行SM2签名时,如何计算SM3摘要?
        • 请求KMS异常,错误码401,应该如何处理?
        • 专属加密类
        • 什么是专属加密?
        • 专属加密如何保障密钥生成的安全性?
        • 机房管理员是否有超级管理权限,在机房插入特权Ukey窃取信息?
        • 文档下载
        • 操作手册
        • 相关协议
        • 服务协议
          无相关产品

          本页目录

          帮助中心 数据加密 最佳实践 如何使用KMS加密保护线下数据
          如何使用KMS加密保护线下数据
          更新时间 2023-11-22 17:40:09
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          最近更新时间: 2023-11-22 17:40:09
          分享文章
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          本小节介绍数据加密如何使用KMS加密保护线下数据最佳实践。

          加解密小量数据

          场景说明

          当有少量数据(例如:口令、证书、电话号码等)需要加解密时,用户可以通过密钥管理服务(Key Management Service,KMS)界面使用在线工具加解密数据,或者调用KMS的API接口使用指定的用户主密钥直接加密、解密数据。

          约束条件

          当前支持不大于4KB的小数据加解密。

          在线工具加解密

          步骤 1 单击目标自定义密钥的别名,进入密钥详细信息在线工具加密数据页面。

          步骤 2 在“加密”文本框中输入待加密的数据。

          步骤 3 单击“执行”,右侧文本框显示加密后的密文数据。

          解密数据

          说明

          加密数据时,使用当前指定的密钥加密数据。

          用户可单击“清除”,清除已输入的数据。

          用户可单击“复制到剪切板”拷贝加密后的密文数据,并保存到本地文件中。

          步骤 4 解密数据时,可单击任意“启用”状态的非默认密钥别名,进入该密钥的在线工具页面。

          步骤 5 单击“解密”,在左侧文本框中数据待解密的密文数据。

          说明

          在线工具自动识别并使用数据被加密时使用的密钥解密数据。

          若该密钥已被删除,会导致解密失败。

          步骤 6 单击“执行”,右侧文本框中显示解密后的明文数据。

          说明

          用户可直接单击“复制到剪切板”拷贝解密后的明文数据,并保存到本地文件中。

          调用API接口加解密

          以保护服务器HTTPS证书为例,采用调用KMS的API接口方式进行说明,如图所示。

          保护服务器HTTPS证书

          image006.png

          流程说明如下:

          1. 用户需要在KMS中创建一个用户主密钥。
          2. 用户调用KMS的“encrypt-data”接口,使用指定的用户主密钥将明文证书加密为密文证书。
          3. 用户在服务器上部署密文证书。
          4. 当服务器需要使用证书时,调用KMS的“decrypt-data”接口,将密文证书解密为明文证书。

          由于控制台输入的加密原文会经过一次Base64转码后才传至后端,所以当调用API接口解密密文的时候,返回的明文就是加密原文经过Base64转码得到的字符串,故API加密密文后需要调用API进行解密,若使用控制台解密API加密密文则会产生乱码。

          加解密大量数据

          场景说明

          当有大量数据(例如:照片、视频或者数据库文件等)需要加解密时,用户可采用信封加密方式加解密数据,无需通过网络传输大量数据即可完成数据加解密。

          加密和解密原理

          大量数据加密

          image009.png

          说明

          用户需要在KMS中创建一个用户主密钥。

          用户调用KMS的“create-datakey”接口创建数据加密密钥。用户得到一个明文的数据加密密钥和一个密文的数据加密密钥。其中密文的数据加密密钥是由指定的用户主密钥加密明文的数据加密密钥生成的。

          用户使用明文的数据加密密钥来加密明文文件,生成密文文件。

          用户将密文的数据加密密钥和密文文件一同存储到持久化存储设备或服务中。

          大量数据解密

          image011.png

          说明

          用户从持久化存储设备或服务中读取密文的数据加密密钥和密文文件。

          用户调用KMS的“decrypt-datakey”接口,使用对应的用户主密钥(即生成密文的数据加密密钥时所使用的用户主密钥)来解密密文的数据加密密钥,取得明文的数据加密密钥。

          若对应的用户主密钥被误删除,会导致解密失败。因此,需要妥善管理好用户主密钥。

          用户使用明文的数据加密密钥来解密密文文件。

          加密和解密的API

          您可以调用以下API,在本地对数据进行加解密。

          API名称 说明
          创建数据密钥 创建数据密钥。
          解密数据密钥 用指定的主密钥解密数据密钥。

          加密本地文件

          步骤1 通过控制台,创建用户主密钥。

          步骤2 请准备基础认证信息。

          • ACCESS_KEY: 帐号Access Key
          • SECRET_ACCESS_KEY: 帐号Secret Access Key
          • PROJECT_ID:项目ID
          • KMS_ENDPOINT: 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语法,请在VM_OPTIONS中添加-ea 
           */ 
          public class FileStreamEncryptionExample { 
           
              private static final String ACCESS_KEY = "<AccessKey>"; 
              private static final String SECRET_ACCESS_KEY = "<SecretAccessKey>"; 
              private static final String PROJECT_ID = "<ProjectID>"; 
              private static final String KMS_ENDPOINT = "<KmsEndpoint>"; 
           
              // KMS服务接口版本信息,当前固定为v1.0 
              private static final String KMS_INTERFACE_VERSION = "v1.0"; 
           
              /** 
               * AES算法相关标识: 
               * - AES_KEY_BIT_LENGTH: AES256密钥比特长度 
               * - AES_KEY_BYTE_LENGTH: AES256密钥字节长度 
               * - AES_ALG: AES256算法,本例分组模式使用GCM,填充使用PKCS5Padding 
               * - AES_FLAG: AES算法标识 
               * - GCM_TAG_LENGTH: GCM TAG长度 
               * - GCM_IV_LENGTH: GCM 初始向量长度 
               */ 
              private static final String AES_KEY_BIT_LENGTH = "256"; 
              private static final String AES_KEY_BYTE_LENGTH = "32"; 
              private static final String AES_ALG = "AES/GCM/PKCS5Padding"; 
              private static final String AES_FLAG = "AES"; 
              private static final int GCM_TAG_LENGTH = 16; 
              private static final int GCM_IV_LENGTH = 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(ACCESS_KEY).withSk(SECRET_ACCESS_KEY) 
                          .withProjectId(PROJECT_ID); 
           
                  // 2.初始化SDK,传入认证信息及KMS访问终端地址 
                  final KmsClient kmsClient = KmsClient.newBuilder().withCredential(auth).withEndpoint(KMS_ENDPOINT).build(); 
           
                  // 3.组装创建数据密钥请求信息 
                  final CreateDatakeyRequest createDatakeyRequest = new CreateDatakeyRequest().withVersionId(KMS_INTERFACE_VERSION) 
                          .withBody(new CreateDatakeyRequestBody().withKeyId(keyId).withDatakeyLength(AES_KEY_BIT_LENGTH)); 
           
                  // 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[GCM_IV_LENGTH]; 
                  final SecureRandom secureRandom = new SecureRandom(); 
                  secureRandom.nextBytes(iv); 
           
                  // 8.对文件进行加密,并存储加密后的文件 
                  doFileFinal(Cipher.ENCRYPT_MODE, inFile, outEncryptFile, plainKey, iv); 
           
              } 
           
              /** 
               * 对文件进行加解密 
               * 
               * @param cipherMode 加密模式,可选值为Cipher.ENCRYPT_MODE或者Cipher.DECRYPT_MODE 
               * @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, AES_FLAG); 
                      final Cipher cipher = Cipher.getInstance(AES_ALG); 
                      final GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 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()); 
                  } 
              } 
           
          }
          
          

          解密本地文件

          步骤1 请准备基础认证信息。

          • ACCESS_KEY: 帐号Access Key
          • SECRET_ACCESS_KEY: 帐号Secret Access Key
          • PROJECT_ID: 项目ID
          • KMS_ENDPOINT: KMS服务访问终端地址。

          步骤2 解密本地文件。

          示例代码中:

          • 用户主密钥:控制台创建的密钥ID。
          • 输出的密文数据文件:SecondEncryptFile.jpg。
          • 加密后再解密的数据文件:ThirdDecryptFile.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语法,请在VM_OPTIONS中添加-ea 
           */ 
          public class FileStreamEncryptionExample { 
           
              private static final String ACCESS_KEY = "<AccessKey>"; 
              private static final String SECRET_ACCESS_KEY = "<SecretAccessKey>"; 
              private static final String PROJECT_ID = "<ProjectID>"; 
              private static final String KMS_ENDPOINT = "<KmsEndpoint>"; 
           
              // KMS服务接口版本信息,当前固定为v1.0 
              private static final String KMS_INTERFACE_VERSION = "v1.0"; 
           
              /** 
               * AES算法相关标识: 
               * - AES_KEY_BIT_LENGTH: AES256密钥比特长度 
               * - AES_KEY_BYTE_LENGTH: AES256密钥字节长度 
               * - AES_ALG: AES256算法,本例分组模式使用GCM,填充使用PKCS5Padding 
               * - AES_FLAG: AES算法标识 
               * - GCM_TAG_LENGTH: GCM TAG长度 
               * - GCM_IV_LENGTH: GCM 初始向量长度 
               */ 
              private static final String AES_KEY_BIT_LENGTH = "256"; 
              private static final String AES_KEY_BYTE_LENGTH = "32"; 
              private static final String AES_ALG = "AES/GCM/PKCS5Padding"; 
              private static final String AES_FLAG = "AES"; 
              private static final int GCM_TAG_LENGTH = 16; 
              private static final int GCM_IV_LENGTH = 12; 
           
              public static void main(final String[] args) { 
                  // 您在控制台创建的用户主密钥ID 
                  final String keyId = args[0]; 
                  // 创建数据密钥时,响应的密文数据密钥 
                  final String cipherText = args[1]; 
           
                  decryptFile(keyId, cipherText); 
              } 
           
              /** 
               * 使用数据密钥加解密文件实例 
               * 
               * @param keyId 用户主密钥ID 
               * @param cipherText 密文数据密钥 
               */ 
              static void decryptFile(String keyId,String cipherText) { 
                  // 1.准备访问认证信息 
                  final BasicCredentials auth = new BasicCredentials().withAk(ACCESS_KEY).withSk(SECRET_ACCESS_KEY) 
                          .withProjectId(PROJECT_ID); 
           
                  // 2.初始化SDK,传入认证信息及KMS访问终端地址 
                  final KmsClient kmsClient = KmsClient.newBuilder().withCredential(auth).withEndpoint(KMS_ENDPOINT).build(); 
           
                  // 3.准备待加密的文件 
                  // inFile 待加密的文件 
                  // outEncryptFile 加密后的文件 
                  // outDecryptFile 加密后再解密的文件 
                  final File inFile = new File("FirstPlainFile.jpg"); 
                  final File outEncryptFile = new File("SecondEncryptFile.jpg"); 
                  final File outDecryptFile = new File("ThirdDecryptFile.jpg"); 
           
                  // 4.使用AES算法进行解密时,初始向量需要与加密时保持一致,此处仅为占位。 
                  final byte[] iv = new byte[GCM_IV_LENGTH]; 
             
                  // 5.组装解密数据密钥的请求,其中cipherText为创建数据密钥时返回的密文数据密钥。 
                  final DecryptDatakeyRequest decryptDatakeyRequest = new DecryptDatakeyRequest() 
                          .withVersionId(KMS_INTERFACE_VERSION).withBody(new DecryptDatakeyRequestBody() 
                                  .withKeyId(keyId).withCipherText(cipherText).withDatakeyCipherLength(AES_KEY_BYTE_LENGTH)); 
           
                  // 6.解密数据密钥,并对返回的16进制明文密钥换成byte数组 
                  final byte[] decryptDataKey = hexToBytes(kmsClient.decryptDatakey(decryptDatakeyRequest).getDataKey()); 
           
                  // 7.对文件进行解密,并存储解密后的文件 
                  // 句末的iv为加密示例中创建的初始向量 
                  doFileFinal(Cipher.DECRYPT_MODE, outEncryptFile, outDecryptFile, decryptDataKey, iv); 
           
                  // 8.比对原文件和加密后再解密的文件 
                  assert getFileSha256Sum(inFile).equals(getFileSha256Sum(outDecryptFile)); 
           
              } 
           
              /** 
               * 对文件进行加解密 
               * 
               * @param cipherMode 加密模式,可选值为Cipher.ENCRYPT_MODE或者Cipher.DECRYPT_MODE 
               * @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, AES_FLAG); 
                      final Cipher cipher = Cipher.getInstance(AES_ALG); 
                      final GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 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()); 
                  } 
              } 
           
              /** 
               * 十六进制字符串转byte数组 
               * 
               * @param hexString 十六进制字符串 
               * @return byte数组 
               */ 
              static byte[] hexToBytes(String hexString) { 
                  final int stringLength = hexString.length(); 
                  assert stringLength > 0; 
                  final byte[] result = new byte[stringLength / 2]; 
                  int j = 0; 
                  for (int i = 0; i < stringLength; i += 2) { 
                      result[j++] = (byte) Integer.parseInt(hexString.substring(i, i + 2), 16); 
                  } 
                  return result; 
              } 
           
              /** 
               * 计算文件SHA256摘要 
               *  
               * @param file 文件  
               * @return SHA256摘要  
               */   
               static String getFileSha256Sum(File file) { 
                  int length; 
                  MessageDigest sha256; 
                  byte[] buffer = new byte[1024]; 
                  try { 
                      sha256 = MessageDigest.getInstance("SHA-256"); 
                  } catch (NoSuchAlgorithmException e) { 
                      throw new RuntimeException(e.getMessage()); 
                  } 
                  try (FileInputStream inputStream = new FileInputStream(file)) { 
                      while ((length = inputStream.read(buffer)) != -1) { 
                          sha256.update(buffer, 0, length); 
                      } 
                      return new BigInteger(1, sha256.digest()).toString(16); 
                  } catch (IOException e) { 
                      throw new RuntimeException(e.getMessage()); 
                  } 
              } 
          }
           
          
          
          上一篇 :  最佳实践
          下一篇 :  云服务使用KMS加解密数据
          文档反馈

          建议您登录后反馈,可在建议与反馈里查看问题处理进度

          鼠标选中文档,精准反馈问题

          选中存在疑惑的内容,即可快速反馈问题,我们会跟进处理

          知道了

           文本反馈
          搜索
          ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
          公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
          备案 京公网安备11010802043424号 京ICP备 2021034386号
          ©2025天翼云科技有限公司版权所有
          京ICP备 2021034386号
          备案 京公网安备11010802043424号
          增值电信业务经营许可证A2.B1.B2-20090001
          用户协议 隐私政策 法律声明