阿里云首页 IoT安全中心

通用上行数据加密接口

ID²通用上行数据加密方案中,端侧提供数据加密接口,服务端提供数据解密接口。

业务流程图

1
说明

该功能需要专门的设备端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的缓存区长度,

输出参数为解密后的数据长度。

示例

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,可用以在全链路追踪请求,便于定位问题

  1. 服务端解密接口通过Id2ClientUtils方式调用,这种调用方式简化了client实例创建方式(Endpoint等参数有缺省值),并为解密接口增加了密钥缓存功能,可以设置是否使能缓存以及缓存大小和时间。

  2. 调用该接口前,需要确保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;
}
首页 IoT安全中心 API参考 IoT设备身份认证API 通用上行数据加密接口