人脸核身“手机号三要素核验”中的KMS加密服务应用

2021-01-31 21:18:36 浏览数 (1)

导语

客户在使用人脸核身服务接口时,出于安全考虑,需要对传输的敏感数据进行加密,此场景需求可以使用腾讯云密钥管理系统KMS完成安全保护。

目前,人脸核身的手机号三要素核验接口已经完成数据加密传输的需求。本篇将详细阐述如何完成接口中涉及的姓名、联系方式、身份证号字段的数据加密,保证客户数据的安全性与可靠性。另外,数据都是采用高效的本地对称加密处理,对业务的访问体验影响很小,客户可以放心使用。

加解密流程框架

人脸核身使用信封加密(Envelope Encryption)应对海量数据的高性能加解密方案。使用 GenerateDataKey 接口生成数据加密密钥 DEK 明文和密文,使用 DEK 明文对数据进行加密,并只需要传输数据加密密钥 DEK 密文到 KMS 服务端(通过 CMK 进行加解密)。

加解密流程框架加解密流程框架

详细操作步骤

数据加密服务开通

按照数据加密文档,首先完成数据加密服务的开通,最终在人脸核身控制台的“数据加密服务”中,生成“密钥ID/密钥名称”,如下:

开通“数据加密服务”开通“数据加密服务”

GenerateDataKey接口调用

调用GenerateDataKey接口,KeyID传入“密钥ID/密钥名称”,KeySpec传入AES_256,如下:

GenerateDataKey接口调用GenerateDataKey接口调用

结果返回如下:(已做脱敏处理)

代码语言:javascript复制
{
  "Response": {
    "RequestId": "934416e3-1d4e-4622-92f2-a389df3f9f53",
    "KeyId": "8xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx9",
    "Plaintext": "7vhA13JTJIXqHLdEwPm8wNtc23I5xxxxxxxxxxxxxx",
    "CiphertextBlob": "08okx7UOUmOFDxERN6zEBVyqIGso1 NR3b58lSHjCebKJRx3nWL Db00SPVZF D6KZo0AC/g3N0coZ9/oBWGoQ==-k-fKVP3WIlGpg8m9LMW4jEkQ==-k-yWxkK2jRnF0uOSV 3Esp6gR1FT7EmhhQGo fEZSr/H/3hEU E/sj4ATCtz4EoP2 r4ZElRNQaWTzxxxxxxxxxxxxxxxx"
  }
}

其中,Plaintext为明文密钥,CiphertextBlob为密文密钥,这两个返回为重点字段。

加密“手机号三要素核验”中的数据

“手机号三要素核验”接口中的IdCard(身份证号)、Name(姓名)、Phone(手机号)可以作为加密数据进行传输,下面以加密“张三”为例,展示具体的NodeJS加密代码:

代码语言:javascript复制
const crypto = require('crypto');

function encryptAes256CBCPKCS7(data, Plaintext) {
    try {
        let iv = "aabbccddeeffgghh";//任意16位长度的字符串,一定要保存
        var clearEncoding = 'utf8';
        var cipherEncoding = 'base64';
        var cipherChunks = [];
        Plaintext = Buffer.from(Plaintext,'base64');//一定要对Plaintext进行base64解码后作为数据密钥本地使用
        var cipher = crypto.createCipheriv('aes-256-cbc', Plaintext, iv);
        cipher.setAutoPadding(true);
        cipherChunks.push(cipher.update(data, clearEncoding, cipherEncoding));
        cipherChunks.push(cipher.final(cipherEncoding));
        return cipherChunks.join('');
    } catch (e) {
        console.error(e);
        return "";
    }
}

//下面出入待验证的姓名、手机号、身份证号;以及Plaintext,完成数据加密
console.log(encryptAes256CBCPKCS7("张三", "7vhA13JTJIXqHLdEwPm8wNtc23I5xxxxxxxxxxxxxxx"))
console.log(encryptAes256CBCPKCS7("13999999999", "7vhA13JTJIXqHLdEwPm8wNtc23I5xxxxxxxxxxxxxxx"))
console.log(encryptAes256CBCPKCS7("210111111111111111", "7vhA13JTJIXqHLdEwPm8wNtc23I5xxxxxxxxxxxxxxx"))

上述代码中要注意iv值的设置,会在接下来的接口调用中用到。数据加密后的示例结果如下:

代码语言:javascript复制
张三: nlScl5H2Ds myWdN8dJN6w==
13999999999: NSuL5oIx10D SdqICQVGmw==
210111111111111111: /4YJymAZtvJTXgHdZk7XnIuYEHQSPVn0jLx0UprASR4=

“手机号三要素核验”接口传入加密后数据

在云API 3.0 Explorer中,传入如下三方面数据,完成加密数据的传输,获得验证结果:

1. 加密后的姓名、手机号、身份证号;

2. 密文密钥CiphertextBlob;

3. 加密项

4.iv值

密文数据的入参与调用密文数据的入参与调用

总结

现在只有“手机号三要素核验”接口实现了数据加密传输,其他接口也会逐步接入KMS加密体系,完成数据加密,敬请大家关注。

0 人点赞