有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
基于对个人隐私信息的保护,按照最小必要返回身份信息的要求,E证通服务不再返回姓名和身份证号的明文信息。如因业务需要返回,可以在 控制台 申请加密的形式返回。申请流程如下:

1. 申请实名信息返回

登录腾讯云 人脸核身控制台,单击自助接入-E证通服务,在E证通服务列表右侧操作栏中单击申请返回身份信息。 将 CA 证书申请表CSR(证书签名请求)文件上传到控制台,确认后单击提交进行申请。


CA 证书申请表参考 模板 进行填写,并上传控制台。
注意
三联申请表及办理人身份证、营业执照复印件需要加盖单位公章。
CSR(证书签名请求)文件制作操作步骤参考如下步骤2。

2. 制作 CSR 文件

2.1 安装国密 SSL
注意
目前该工具安装暂不支持 MAC M1 处理器。
提供两种下载方式:
git 下载,需要先安装 git 工具。
# 拉取源码
git clone -b GmSSL-v2 https://github.com/guanzhi/GmSSL.git
# 进入目录
cd GmSSL
链接下载。
# 下载源码包
wget https://github.com/guanzhi/GmSSL/archive/refs/heads/GmSSL-v2.zip
# 解压文件
unzip GmSSL-v2.zip
# 进入目录
cd GmSSL-GmSSL-v2
下载方式任选一种,成功执行后,已经进入相应文件夹内,然后执行下方操作:
# 如果 MAC 机器,执行,Linux 环境机器跳过该步骤直接编译即可
sed -i '' 's%qw/glob%qw/:glob%g' Configure
sed -i '' 's%qw/glob%qw/:glob%g' test/build.info
# 编译
./config
# 安装(如果有旧版本,可以使用 make uninstall 卸载,然后删除对应文件)
make
sudo make install
# 安装成功后,查看安装信息
gmssl version -a
2. 2 生成公私钥对
gmssl ecparam -genkey -name sm2p256v1 -out CAkey.pem
2.3 查看并保留私钥
注意:
请务必复制保存私钥。
gmssl pkey -in CAkey.pem -noout -text



2.4 创建证书请求
gmssl req -utf8 -new -sm3 -key CAkey.pem -out CAcsr.pem



2.5 查看证书请求
gmssl req -in CAcsr.pem -noout -text -subject
至此,证书请求制作完成,请将 CAcsr.pem 文件上传 控制台数据解密需要使用CAkey.pem(私钥),请自行妥善保存,否则将无法完成解密

3. 解密流程

在拉到核身结果后,EidInfo 中会有 DesKey 和 UserInfo,需要使用上面生成私钥解密。解密过程如下:
使用 SM2 和上面生成的私钥对 DesKey(Base64 decode 成字节数组)解密获得“会话密钥”。
使用会话密钥和sm4算法 ecb 模式(无填充)解密获得明文字符串。
字符串格式为{"name":"姓名","idtype":"01(代表身份证)","idnum":"身份证号"}。

3.1 Demo 代码

GO 代码示例:
// require github.com/tjfoc/gmsm v1.4.1 或者go get github.com/tjfoc/gmsm
import(
"github.com/tjfoc/gmsm/sm2"
"github.com/tjfoc/gmsm/sm4"
"github.com/tjfoc/gmsm/x509"
)

const PrivateKey = "f9b587743f051b1e59efa05125f31b5bf371957bf3d3012c1739091334b73738"
const DesKey = "xxx"
const UserInfo = "xxx"

func decode() {
privateKey, err := x509.ReadPrivateKeyFromHex(PrivateKey) //上述私钥16进制
dek, _ := base64.StdEncoding.DecodeString(DesKey)
sm4Key, err := sm2.Decrypt(privateKey, dek, 0)
info, _ := base64.StdEncoding.DecodeString(UserInfo)
out, err := sm4.Sm4Ecb(sm4Key, info, false)
fmt.Println(string(out), err)
}
Java 代码示例:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>1.69</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.15</version>
</dependency>

// hutool-all 工具类使用最新版本即可。
// bouncycastle 请使用与当前JDK相对应的版本。

private static final String PrivateKeyHex = "f9b587743f051b1e59efa05125f31b5bf371957bf3d3012c1739091334b73738";
private static final String DesKey = "xxx";
private static final String UserInfo = "xxx";

public void DecodeUserInfo() {
byte[] desKeyBytes = Base64.decode(DesKey);
final SM2 sm2 = new SM2(PrivateKeyHex, null, null);
sm2.usePlainEncoding();

byte[] sm4KeyBytes = sm2.decrypt(desKeyBytes);
SymmetricCrypto sm4 = SmUtil.sm4(sm4KeyBytes);
byte[] plaintext = sm4.decrypt(Base64.decode(UserInfo));
System.out.println(new String(plaintext));
}
nodejs 代码示例:
const {SM2, SM4} = require('gm-crypto') const PrivateKeyHex = "f9b587743f051b1e59efa05125f31b5bf371957bf3d3012c1739091334b73738" const DesKey = "xxx" const UserInfo = "xxx" const sm4Key = SM2.decrypt(Buffer.from(DesKey, 'base64').toString("hex").substring(2), PrivateKeyHex, { inputEncoding: 'hex', outputEncoding: 'hex', mode: 1 }) const plaintext = SM4.decrypt(UserInfo, sm4Key, { inputEncoding: 'base64', outputEncoding: 'utf8' }) console.log(plaintext)