腾讯云人脸核身敏感数据加密指引_AI解决方案_同尘科技

人脸核身 1年前 (2023-09-05) 浏览 54

此指引适用于使用人脸核身服务接口,需要对传输敏感数据进行加密的场景。
如果您在2023年3月17日前已开通 KMS 加密服务,可继续使用腾讯云密钥管理系统 KMS 安全保护的主密钥 CMK 作为加密密钥,请查看 KMS 加密指引 文档。如果您使用的开发语言是Java、Go、Nodejs,推荐使用 方式一 实现加解密。如果开发语言不在上述范围,推荐使用 方式二 实现加解密功能。

方式一:使用官方 SDK 实现加解密(推荐)

官方 SDK 当前支持 Java、Go、Nodejs 开发语言,使用步骤如下:

获取加解密 SDK

Java获取依赖DemoGolang获取依赖Demo

使用 SDK

引入公共依赖

    org.bouncycastle    bcprov-jdk15on    1.70    org.bouncycastle    bcpkix-jdk15on    1.70

引入加解密 SDK

下载最新的 release 版本 jar 包,并在项目工程中引入。
参考下方的接口 Demo 实现敏感信息加解密功能。

接口敏感信息加解密 DEMO

实名核身鉴权:DetectAuth获取实名核身结果信息增强版:GetDetectInfoEnhanced获取E证通 Token:GetFaceIdToken照片人脸核身:ImageRecognition银行卡四要素核验:BankCard4EVerification银行卡三要素核验:BankCardVerification银行卡基础信息查询:CheckBankCardInformation身份信息及有效期核验:CheckIdNameDate手机号二要素核验:CheckPhoneAndName身份证识别及信息核验:IdCardOCRVerification身份证二要素核验:IdCardVerification手机号在网时长核验:MobileNetworkTimeVerification手机号状态查询:MobileStatus手机号三要素核验:PhoneVerification手机号三要素核验(移动):PhoneVerificationCMCC手机号三要素核验(电信):PhoneVerificationCTCC手机号三要素核验(联通):PhoneVerificationCUCC

方式二:不使用官方 SDK 实现加解密

加解密流程说明

当前敏感信息加解密支持标准加密算法 AES-CBC 和国密算法 SM4-GCM,可以根据业务要求从中选择适合您的加密算法。敏感信息加解密的本质是对接口传输的姓名、身份证号做对称加密后传输,人脸核身服务收到加密数据后先解密,然后在进行核身业务。如果人脸核身接口返回结果涉及敏感信息,则会使用相同的对称密钥加密,调用方在收到接口响应时需要对敏感信息解密。对称密钥由调用方本地随机生成,为保证对称密钥的安全传输,需要调用方配合使用非对称加密算法加密对称密钥。加密的公钥可以登录 人脸核身控制台 获取。

sequenceDiagram    participant customer as 客户    participant faceid as 人脸核身服务端    participant console as 人脸核身控制台    console-->>customer: 获取公钥
rect rgba(191, 223, 255, 0.7) customer->>customer: 本地随机生成对称密钥 customer->>customer: 公钥加密对称密钥 customer->>customer: 用对称密钥加密敏感信息参数(姓名、身份证号) end
customer->>faceid: 调用人脸核身接口(加密的对称密钥CiphertextBlob、初始向量IV、密文参数) faceid->>console: 获取私钥 faceid->>faceid: 解密CiphertextBlob,获得对称密钥 faceid->>faceid: 用对称密钥解密敏感数据 faceid->>faceid: 核验 faceid->>faceid: 用客户传入的对称密钥和iv加密返回值 faceid->>customer: 返回核验结果 rect rgba(191, 223, 255, 0.7) customer->>customer: 用本地生成的对称密钥明文、IV解密返回值 end



使用 AES-256-CBC 算法

加载 RSA 公钥

加载 RSA 公钥:对控制台获取到的公钥字符串先做 Base64 Decode,然后按对应格式加载。格式:PKCS1保存格式:pem 格式 Base64编码长度:1024

// 加载RSA公钥bytes, err := base64.StdEncoding.DecodeString(publicKey)if err != nil {  return nil, err}block, _ := pem.Decode(bytes)x509.ParsePKCS1PublicKey(block.Bytes)

生成对称密钥和向量

随机生成32字节长度的对称密钥以及16字节的初始向量,初始向量表示为 IV。

// 生成对称密钥key := make([]byte, 32)rand.Read(key)
// 生成16字节iviv := make([]byte, 16)rand.Read(iv)

RSA 公钥加密对称密钥

使用 RSA 公钥加密前面生成的 对称密钥,将加密后的结果表示为 CiphertextBlob。

// 加密对称密钥Keybuffer := bytes.Buffer{}bytes, _ := rsa.EncryptPKCS1v15(rand.Reader, publicKey, key)buffer.Write(bytes)buffer.Bytes()

加密敏感数据

使用前面生成的 对称密钥和初始向量,采用 AES-256-CBC 算法加密敏感数据(姓名、身份证号)。

// AES-CBC加密明文数据// 明文密钥key// 初始向量iv// 敏感数据plaintextblock, _ := aes.NewCipher(key)blockSize := block.BlockSize()pkcs7 := func(cipherText []byte, blockSize int) []byte {    padding := blockSize - len(cipherText)%blockSize    padText := bytes.Repeat([]byte{byte(padding)}, padding)    return append(cipherText, padText...)}plaintext = pkcs7(plaintext, blockSize)blockMode := cipher.NewCBCEncrypter(block, iv)ciphertext := make([]byte, len(plaintext))blockMode.CryptBlocks(ciphertext, plaintext)fmt.Print(ciphertext)

调用人脸核身接口

以身份证二要素(IdCardVerification)接口为例:
原始数据为:

{    "Action": "IdCardVerification",    "Version": "2018-03-01",    "IdCard": "100822119610104046",    "Name": "张三"}

CiphertextBlob、IV、TAG、加密后的姓名、身份证号在传输前均需要做一次 Base64 编码:生成的对称密钥为:1abrmh7jz83awn4585vzujiyxbhi5wsd(32字节)生成的初始向量(IV):t9Uf9QJ50B0uHhE26JLNxw==(16字节IV,Base64编码)公钥加密后的对称密钥(CiphertextBlob):eqB5H23bbNQGTxCxSHP+FaXy+LlfK2GJ8l19UxTbikdezY1mGINQxS76J9rUa61W2jrm4j6eQ39O9pus/Wk5zP6t48Gd8M6RHld17/pPTnAVzjTwYZhy0yBvuyh7N73J5/fL2TSgJTMVi79urCC17C0oYdyBsK+hP9bIfzwxb3g=(Base64编码)使用对称密钥加密IdCard和Name,加密后的结果分别为:IdCard:H+ZwsBfYVgbBWaHStriUV2GF0wX7MzYy0XMWNKZjZjQ=(Base64编码)Name:IS6wLE153MfBr639hqWmUQ==(Base64编码)最终加密后的接口数据为:

{    "Action": "IdCardVerification",     "Version": "2018-03-01",    "IdCard": "H+ZwsBfYVgbBWaHStriUV2GF0wX7MzYy0XMWNKZjZjQ=", // 加密后的身份证号    "Name": "IS6wLE153MfBr639hqWmUQ==", // 加密后的姓名    "Encryption": {        "EncryptList": [ // 用于标记加密字段            "IdCard",            "Name"        ],        "CiphertextBlob":  "eqB5H23bbNQGTxCxSHP+FaXy+LlfK2GJ8l19UxTbikdezY1mGINQxS76J9rUa61W2jrm4j6eQ39O9pus/Wk5zP6t48Gd8M6RHld17/pPTnAVzjTwYZhy0yBvuyh7N73J5/fL2TSgJTMVi79urCC17C0oYdyBsK+hP9bIfzwxb3g=", // 加密后的对称密钥        "Iv": "t9Uf9QJ50B0uHhE26JLNxw==", // 加密初始向量        "Algorithm": "AES-256-CBC" // 采用的加密算法    }}

使用 SM4-GCM 算法

加载 SM2公钥

加载 SM2公钥:对控制台获取到的公钥字符串先做 Base64 Decode,然后按对应格式加载。格式:PKCS8保存格式:pem格式Base64编码长度:512

// 加载SM2公钥bytes, err := base64.StdEncoding.DecodeString(publicKey)if err != nil {    return nil, err}x509.ReadPublicKeyFromPem(bytes)

生成对称密钥和向量

随机生成16字节长度的对称密钥以及12字节的初始向量,初始向量表示为 IV。

// 生成对称密钥key := make([]byte, 16)rand.Read(key)
// 生成16字节iviv := make([]byte, 12)rand.Read(iv)

SM2公钥加密对称密钥

使用 SM2公钥加密前面生成的 对称密钥,将加密后的结果表示为 CiphertextBlob注意输出密文时采用 C1C3C2数据拼接方式数据类型转换时,均使用 PC=04的方式,即未压缩。

// 加密对称密钥Keyciphertext, err := sm2.Encrypt(publicKey, plaintext, rand.Reader, sm2.C1C3C2)if err != nil {    return nil, err}return cipherText, nil

加密敏感数据

使用前面生成的 对称密钥和初始向量,采用 SM4-GCM 算法加密敏感数据(姓名、身份证号)。

// SM4-GCM加密明文数据// 明文密钥key// 初始向量iv// 敏感数据plaintextblock, err := sm4.NewCipher(key)if err != nil {    return nil, nil, err}gcm, err := cipher.NewGCM(block)if err != nil {    return nil, nil, err}ciphertext := gcm.Seal(nil, iv, plaintext, nil)tag := ciphertext[len(ciphertext)-gcm.Overhead():]ciphertextWithoutTag := ciphertext[:len(ciphertext)-gcm.Overhead()]return ciphertextWithoutTag, tag, nil

调用人脸核身接口

以身份证二要素(IdCardVerification)接口为例:
原始数据为:

{    "Action": "IdCardVerification",    "Version": "2018-03-01",    "IdCard": "100822119610104046",    "Name": "张三"}

CiphertextBlob、IV、TAG、加密后的姓名、身份证号在传输前均需要做一次Base64编码生成的对称密钥为:45c3royvhyj6cavv(16字节)生成的初始向量(IV):bIGEqJyU+8MIJO3u(12字节IV,Base64编码)公钥加密后的对称密钥(CiphertextBlob):BD1WkCZPN1Tn0jzNIZoHf1JHjBFDRRdVnj9UV9gETROOo+HhOJcQreZacgVyPqE+E4OqDvtu5cttXsIhztDV7uYJZmNdpFWnTnXtSgjXFvOf2n48gNMu5I0Ung5+VrDN2SzY2D9cetiuOFktsJEzTCs=(Base64编码)使用对称密钥加密IdCard和Name,加密后的结果分别为:IdCard:8qjVE9kEqW7R3x3Nd5AM5PDb(Base64编码) Tag:wMyiG6JUzj4CIiZ+V5mqwA==(Base64编码)Name:JiRFz1O/(Base64编码)Tag:msgrOgSfnMEK1ZzPtcaaFg==(Base64编码)最终加密后的接口数据为:

{    "Action": "IdCardVerification",     "Version": "2018-03-01",    "IdCard": "8qjVE9kEqW7R3x3Nd5AM5PDb", // 加密后的身份证号    "Name": "JiRFz1O/", // 加密后的姓名    "Encryption": {        "EncryptList": [ // 用于标记加密字段            "IdCard",            "Name"        ],          "TagList": [ // 用于验证消息完整性              "wMyiG6JUzj4CIiZ+V5mqwA==",              "msgrOgSfnMEK1ZzPtcaaFg=="        ],        "CiphertextBlob":  "BD1WkCZPN1Tn0jzNIZoHf1JHjBFDRRdVnj9UV9gETROOo+HhOJcQreZacgVyPqE+E4OqDvtu5cttXsIhztDV7uYJZmNdpFWnTnXtSgjXFvOf2n48gNMu5I0Ung5+VrDN2SzY2D9cetiuOFktsJEzTCs=", // 加密后的对称密钥        "Iv": "bIGEqJyU+8MIJO3u", // 加密初始向量        "Algorithm": "SM4-GCM" // 采用的加密算法    }}



对解决方案有疑惑?想了解解决方案收费? 联系解决方案专家

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心,购买腾讯云享受折上折,更有现金返利:同意关联,立享优惠

阿里云解决方案也看看?: 点击对比阿里云的解决方案

- 0人点赞 -

发表点评 (0条)

not found

暂无评论,你要说点什么吗?