活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上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云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心
      文档中心

      人脸识别

      人脸识别

        • 产品动态
        • 产品介绍
        • 产品定义
        • 产品优势
        • 功能特性
        • 应用场景
        • 术语解释
        • 计费说明
        • 计费模式
        • 产品续订
        • 产品退订
        • 快速入门
        • 入门指引
        • 服务创建
        • 入门操作
        • 入门实践
        • 用户指南
        • 产品购买
        • 创建应用及开通应用
        • 用户控制台
        • API调用指南
        • 最佳实践
        • 人脸活体检测
        • 人脸比对
        • API参考
        • 调用前必知
        • 概述
        • API概览
        • 状态码
        • 如何调用API
        • 终端节点
        • 构造请求
        • 认证鉴权
        • 接口加密
        • Python3调用示例
        • Java调用示例
        • PHP调用示例
        • C#调用示例
        • API
        • 人脸检测
        • 人脸属性识别
        • 人脸比对
        • 人脸活体检测
        • 是否戴口罩识别
        • 人脸实名认证
        • 更新历史
        • 常见问题
        • 计费类
        • 购买类
        • 操作类
        • 使用限制
        • 安全相关
        • 文档下载
        • 用户使用手册
        • 相关协议
        • 服务条款
          无相关产品

          本页目录

          帮助中心人脸识别API参考如何调用API接口加密
          接口加密
          更新时间 2024-09-10 09:29:24
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          最近更新时间: 2024-09-10 09:29:24
          分享文章
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接

          1 如何启用加密功能

          客户端发起请求时添加请求Header头,decrypted=true 即可启用接口加密功能。

          2 加密算法说明

          该功能涉及到三种国密算法,分别为非对称加密SM2、对称加密SM4及特征码算法Hmac-SM3。

          2.1 非对称加密SM2

          类似RSA的非对称加密,用来加密客户生成的对称加密SM4密钥。SM2公钥在AI能力开放平台(https://ai.ctyun.cn/console)中我的应用中应用详情下获取,控制台显示内容为经过Base64加密后的公钥字符串。算法标准约定:SM2算法采用BC包(BouncyCastle),sm2p256v1标准,格式为PKCS8,拼接方式C1C3C2,非压缩格式。

          2.2 对称加密SM4

          客户端自行生成128或者256位SM4密钥,采用BC包(BouncyCastle),格式为SM4/ECB/PKCS5Padding。

          2.3 特征码算法Hmac-SM3

          Hmac和SM3算法配合生成特征码串,防止接口被拦截篡改,生成特征码时的密钥需使用。
          encryptedHashKey字段传递到服务端。

          2.4 客户端加密步骤

          1、从控制台获取公钥串,使用Base64解密获取公钥字节数组。
          2、生成SM4对称密钥字节数组,使用第1步的公钥加密对称密钥,并使用Base64加密结果,填入ciphertextBlob字段。
          3、使用第2步生成的对称密钥加密接口原版Body体JSON串,并使用Base64加密结果,填入encryptedBody字段。
          4、生成Hmac-sm3哈希密钥,使用公钥进行加密,并使用Base64加密结果,填encryptedHashKey字段。
          5、使用Hmac-sm3及第4步哈希密钥,提取ciphertextBlob字段特征码并使用Base64加密结果,填入ciphertextBlobHash字段。
          6、使用Hmac-sm3及第4步哈希密钥,提取encryptedBody字段特征码并使用Base64加密结果,填入encryptedBodyHash字段。

          2.5 请求体结构

          入参结构体如下,下列五个参数都需要经过Base64加密处理:

          {
          	"ciphertextBlob":"使用SM2公钥加密后的客户生成SM4对称密钥",
          	"encryptedBody":"使用对称密钥SM4加密后的接口原版Body体JSON串,编码UTF-8",
          	"encryptedHashKey":"使用公钥加密后的进行hmac-sm3哈希时使用的密钥",
          	"ciphertextBlobHash":"ciphertextBlob字段的hmac-sm3结果",
          	"encryptedBodyHash":"encryptedBody字段的hmac-sm3结果"
          
          }
          

          2.6 返回体结构

          若接口返回非0错误,则不进行加密,结构同未使用加密功能时一致,客户端可根据返回体是否包含statusCode进行区分。
          若接口请求成功且返回statusCode为0,则会进行加密处理,返回值如下,下列两个参数都经过Base64加密处理:

          {
          	"encryptedResultHash": "encryptedResult字段的hmac-sm3结果,哈希密钥与客户端一致",
          	"encryptedResult": "SM4对称密钥加密后的接口响应结果"
          }
          

          客户端获取返回值后可选择性校验encryptedResultHash确保请求结果未被篡改。
          获取encryptedResult字段后,使用请求时的sm4对称密钥进行解密,即可获取到未启用加密时接口的正常返回体内容(JSON串),编码UTF8。

          2.7 加解密相关错误码说明

          encryptedResult字段通过SM4对称密钥解密后可获取到不启用加密功能格式的返回值,相比未使用加密功能的请求方式,会有以下几种特殊错误码:

          错误码 错误信息 错误描述
          AI_OP_40017 加密参数不符合要求 入参格式不符合加密功能要求
          AI_OP_40018 ciphertextBlob哈希值不匹配/encryptedBody哈希值不匹配 相关字段哈希值不匹配,存在被篡改可能
          AI_OP_40019 SM2解密失败 SM2非对称解密出现异常
          AI_OP_40020 SM4加密失败/SM4解密失败 SM4对称密钥加解密出现异常

          3 参考代码(JAVA,jdk1.8及以上)

          3.1 maven工程引入以下依赖

          <!-- BC包,若jdk为1.8以下可替换对应版本及artifactId-->

          <dependency>

          <groupId>org.bouncycastle</groupId>

          <artifactId>bcprov-jdk18on</artifactId>

          <version>1.78.1</version>

          </dependency>

          <!--Base64功能包,推荐使用此包内Base64类进行加解密,生成加密结果不能包含换行-->

          <dependency>

          <groupId>commons-codec</groupId>

          <artifactId>commons-codec</artifactId>

          <version>1.17.1</version>

          </dependency>

          3.2 SM2工具类

          import org.bouncycastle.jce.provider.BouncyCastleProvider;
          import javax.crypto.Cipher;
          import java.security.*;
          import java.security.spec.ECGenParameterSpec;
          import java.security.spec.PKCS8EncodedKeySpec;
          import java.security.spec.X509EncodedKeySpec;
          public class SM2Util {
          static {
          Security.addProvider(new BouncyCastleProvider());
          }
          // 生成SM2密钥对
          public static KeyPair generateKeyPair() {
          try{
          KeyPairGenerator keyPairGenerator =
          KeyPairGenerator.getInstance("EC", "BC");
          keyPairGenerator.initialize(new ECGenParameterSpec("sm2p256v1"));
          return keyPairGenerator.generateKeyPair();
          } catch (Exception e) {
          //TODO 做异常处理
          }
          }
          // 加密
              public static byte[] encrypt(byte[] publicKey, byte[] data) {
                  try{
                      PublicKey pubKey = KeyFactory.getInstance("EC", "BC")
                              .generatePublic(new X509EncodedKeySpec(publicKey));
          
                      Cipher cipher = Cipher.getInstance("SM2", "BC");
                      cipher.init(Cipher.ENCRYPT_MODE, pubKey);
          
                      return cipher.doFinal(data);
                  } catch (Exception e) {
                      //TODO 做异常处理
                  }
          
              }
          
              // 解密
              public static byte[] decrypt(byte[] privateKey, byte[] encryptedData) {
                  try{
                      PrivateKey priKey = KeyFactory.getInstance("EC", "BC")
                              .generatePrivate(new PKCS8EncodedKeySpec(privateKey));
          
                      Cipher cipher = Cipher.getInstance("SM2", "BC");
                      cipher.init(Cipher.DECRYPT_MODE, priKey);
          
                      return cipher.doFinal(encryptedData);
                  } catch (Exception e) {
                      //TODO 做异常处理
                  }
              }
          
              public static void main(String[] args) {
                  KeyPair keyPair = generateKeyPair();
                  byte[] a = keyPair.getPublic().getEncoded();
                  byte[] b = keyPair.getPrivate().getEncoded();
              }
          }
          

          3.3 SM4工具类

          import org.bouncycastle.jce.provider.BouncyCastleProvider;
          
          import javax.crypto.Cipher;
          import javax.crypto.KeyGenerator;
          import javax.crypto.SecretKey;
          import javax.crypto.spec.SecretKeySpec;
          import java.security.Security;
          
          public class SM4Util {
          
              static {
                  Security.addProvider(new BouncyCastleProvider());
              }
          
              // 生成SM4密钥
              public static byte[] generateKey() {
                  try{
                      KeyGenerator keyGenerator = KeyGenerator.getInstance("SM4", "BC");
                      keyGenerator.init(128); // 可选 128 或 256
                      SecretKey secretKey = keyGenerator.generateKey();
                      return secretKey.getEncoded();
                  } catch (Exception e) {
                      //TODO 处理异常
                  }
          
              }
          
              // 加密
              public static byte[] encrypt(byte[] keyBytes, byte[] data) {
                  try{
                      SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "SM4");
                      Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding", "BC");
                      cipher.init(Cipher.ENCRYPT_MODE, keySpec);
                      return cipher.doFinal(data);
                  } catch (Exception e) {
                      //TODO 处理异常
                  }
          
              }
          
              // 解密
              public static byte[] decrypt(byte[] keyBytes, byte[] encryptedData) {
                  try{
                      SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "SM4");
                      Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding", "BC");
                      cipher.init(Cipher.DECRYPT_MODE, keySpec);
                      return cipher.doFinal(encryptedData);
                  } catch (Exception e) {
                      //TODO 处理异常
                  }
          
              }
          }
          

          3.4 Hmac-sm3工具类

          import org.apache.commons.codec.binary.Base64;
          import org.bouncycastle.crypto.digests.SM3Digest;
          import org.bouncycastle.crypto.macs.HMac;
          import org.bouncycastle.crypto.params.KeyParameter;
          
          import java.security.SecureRandom;
          
          public class HmacSM3Util {
          
              /**
               * 计算 HMAC-SM3
               *
               * @param key 密钥
               * @param data 数据
               * @return HMAC-SM3 值
               */
              public static byte[] hmacSM3(byte[] key, byte[] data) {
                  HMac hmac = new HMac(new SM3Digest());
                  hmac.init(new KeyParameter(key));
          
                  hmac.update(data, 0, data.length);
          
                  byte[] result = new byte[hmac.getMacSize()];
                  hmac.doFinal(result, 0);
          
                  return result;
              }
          
              /**
               * 生成指定长度的随机密钥
               *
               * @param length 密钥长度(字节)
               * @return 随机生成的密钥
               */
              public static byte[] generateRandomKey(int length) {
                  SecureRandom random = new SecureRandom();
                  byte[] key = new byte[length];
                  random.nextBytes(key);
                  return key;
              }
          
              // 示例用法
              public static void main(String[] args) {
                  // 生成随机密钥
                  byte[] key = generateRandomKey(16); // 16字节长度的随机密钥
          
                  // 待计算的数据
                  byte[] data = "Hello, HMAC-SM3!".getBytes();
          
                  // 计算 HMAC-SM3 值
                  byte[] hmacValue = hmacSM3(key, data);
          
                  // 打印结果
                  System.out.println("HMAC-SM3 值: " + Base64.encodeBase64String(hmacValue));
              }
          }
          

          3.5 生成请求体

                  //未启用加密功能时的请求体json串,查询对应接口文档确定格式
                  String body = "{\"ImageData\":\"imagedatabase64xxxx\"}";
                  //控制台-应用详情下获取的公钥
                  String encKey = "xxxxxxx";
          
                  Map<String,String> requestBody = new HashMap<>();
                  //公钥转换为字节数组备用
                  byte[] publicKey = Base64.decodeBase64(encKey);
                  //生成ciphertextBlob字段
                  byte[] sm4Key = SM4Util.generateKey();
                  requestBody.put("ciphertextBlob", Base64.encodeBase64String(SM2Util.encrypt(publicKey, sm4Key)));
                  //生成encryptedBody字段
                  requestBody.put("encryptedBody", Base64.encodeBase64String(SM4Util.encrypt(sm4Key, body.getBytes())));
                  //生成Hmac-sm3密钥
                  byte[] hmacSm3Key = HmacSM3Util.generateRandomKey(16);
                  //生成encryptedHashKey字段
                  requestBody.put("encryptedHashKey", Base64.encodeBase64String(SM2Util.encrypt(publicKey, hmacSm3Key)));
                  //生成ciphertextBlobHash字段
                  requestBody.put("ciphertextBlobHash", Base64.encodeBase64String(HmacSM3Util.hmacSM3(hmacSm3Key, requestBody.get("ciphertextBlob").getBytes())));
                  //生成encryptedBodyHash字段
                  requestBody.put("encryptedBodyHash", Base64.encodeBase64String(HmacSM3Util.hmacSM3(hmacSm3Key, requestBody.get("encryptedBody").getBytes())));
          
          	//TODO requestBody即为加密请求体,遵循鉴权逻辑调用接口即可,鉴权部分逻辑请参考鉴权相关说明文档
          
          文档反馈

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

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

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

          知道了

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