通用上行数据加密接口
ID²通用上行数据加密方案中,端侧提供数据加密接口,服务端提供数据解密接口。
业务流程图
该功能需要专门的设备端SDK、服务端SDK,获取SDK请联系我们。
id2_client_encrypt
函数原型:irot_result_t id2_client_encrypt(const char *seed, const uint8_t *in, uint32_t in_len,
uint8_t *out, uint32_t *out_len)
功能描述:设备端数据加密接口。使用ID²派生密钥,加密业务数据。
参数描述:
参数 | 参数类型 | 描述 |
seed | 输入参数 | 加密种子,参与数据加密过程,提升加密强度,该字段可以为空;解密时需要传入相同的seed。 |
in | 输入参数 | 待加密的数据起始地址。 |
in_len | 输入参数 | 待加密的数据长度。 |
out | 输出参数 | 加密后的数据起始地址。 |
out_len | 输入参数和输出参数 | 输入参数为参数out的缓存区长度, 输出参数为解密后的数据长度。 |
返回值:成功时返回0;其他返回值,请参考设备端错误码。
示例
int id2_client_encrypt_data_test()
{
int ret = 0;
uint32_t out_len = 0;
uint32_t id2_len = 0;
uint8_t out_data[ID2_ID_LEN + 32] = {0};
uint8_t id2_data[ID2_ID_LEN + 1] = {0};
char *seed = "453255";
ID2_DBG_LOG("====> ID2 Client Test Encrypt Start.\n");
ret = id2_client_init();
if (ret != IROT_SUCCESS) {
ID2_DBG_LOG("id2 client init fail, %d\n", ret);
return -1;
}
id2_len = ID2_ID_LEN;
ret = id2_client_get_id(id2_data, &id2_len);
if (ret != IROT_SUCCESS) {
ID2_DBG_LOG("id2 get id fail, %d\n", ret);
ret = -1;
goto _out;
}
out_len = ID2_ID_LEN + 32;
ret = id2_client_encrypt(seed, id2_data, id2_len, out_data, &out_len);
if (ret != IROT_SUCCESS) {
ID2_DBG_LOG("id2 client encrypt fail, %d %d\n", ret, out_len);
ret = -1;
goto _out;
}
ret = 0;
_out:
if (ret < 0) {
ID2_DBG_LOG("=================>ID2 Client Test Encrypt Fail.\n\n");
return -1;
} else {
ID2_DBG_LOG("=================>ID2 Client Test Encrypt Pass.\n\n");
}
id2_client_cleanup();
return ret;
}
decryptData
服务端数据解密接口,使用ID²派生密钥解密业务数据。密钥由ID²服务端派生的,数据解密在本地完成;此外,SDK也提供了解密密钥的本地缓存功能
输入参数
名称 | 类型 | 是否必须 | 示例值 | 描述 |
id2 | String | 是 | 00AAABBB11122281FE15**** | ID²标识 |
seed | String | 否 | 453255 | 解密种子,需保持跟数据加密过程使用的值相同 |
encryptedData | String | 是 | 6WmRCnYsy/TNM/RyNYj2WRLiuw1ttOwqbKdiTG/BzwE6YjiApnAunPE+hZ4Lpv0F | 待解密数据,base64编码格式。 端侧加密数据需要做base64编码 |
apiVersion | String | 是 | 1.0.0 | api版本号,当前取值1.0.0 |
返回数据
名称 | 类型 | 示例值 | 描述 |
code | Integer | 200 | 错误码,200表示成功,其他参见“错误码” |
success | Boolean | true | true:成功; false:失败 |
data | String | MDBGRkZGMEZCQjdDMEU3QzBFRkVBNjAw | success为true时,表示解密之后的数据,Base64编码格式 |
requestId | String | B9A81E1E-874C-57A4-81F5-AF4A6304BEF0 | 请求ID,可用以在全链路追踪请求,便于定位问题 |
服务端解密接口通过Id2ClientUtils方式调用,这种调用方式简化了client实例创建方式(Endpoint等参数有缺省值),并为解密接口增加了密钥缓存功能,可以设置是否使能缓存以及缓存大小和时间。
调用该接口前,需要确保ID²已成功激活并绑定到本账号下(ID²首次认证成功时自动激活,可参考verify接口)。
示例
String ACCESS_KEY = ""; // 阿里云账号AK
String ACCESS_SECRET = ""; // 阿里云账号AS
Id2ClientUtils.setAccessKey(ACCESS_KEY, ACCESS_SECRET); // 设置账号AK
CustomDecryptDataResponse response = null;
try {
CustomDecryptDataRequest request = new CustomDecryptDataRequest();
request.setId2(id2);
request.setApiVersion("1.0.0");
request.setSeed(seed);
request.setEncryptedData(Base64.encode(Hex.decodeHex(encryptedData)));
response = Id2ClientUtils.decryptData(request);
} catch (DecoderException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
if (response == null || response.getCode() != 200) {
System.out.println("decryptData api return error. " + (response == null ? "null" : response.getCode()));
return;
}
configCache
设置解密密钥缓存接口
输入参数
名称 | 类型 | 示例值 | 描述 |
enable | boolean | true | 是否使能密钥缓存 |
maxSize | Long | 100000L | 缓存大小。每个设备(ID²)缓存一条记录 enable参数为true时,该参数不能为空 |
expireTimeSecond | Long | 3600L | 缓存时间。单位为s |
输出参数
无
示例
String ACCESS_KEY = ""; // 阿里云账号AK
String ACCESS_SECRET = ""; // 阿里云账号AS
Id2ClientUtils.setAccessKey(ACCESS_KEY, ACCESS_SECRET); // 设置账号AK
Id2ClientUtils.configCache(true, 100000L, 3600L); // 使能密钥缓存,并配置缓存大小和时间
CustomDecryptDataResponse response = null;
try {
CustomDecryptDataRequest request = new CustomDecryptDataRequest();
request.setId2(id2);
request.setApiVersion("1.0.0");
request.setSeed(seed);
request.setEncryptedData(Base64.encode(Hex.decodeHex(encryptedData)));
response = Id2ClientUtils.decryptData(request);
} catch (DecoderException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
if (response == null || response.getCode() != 200) {
System.out.println("decryptData api return error. " + (response == null ? "null" : response.getCode()));
return;
}
- 本页导读 (0)