HarmonyOS门锁品类的临时密码、照片编解码工具技术 - HarmonyOS技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

[文章]

HarmonyOS门锁品类的临时密码、照片编解码工具技术

HarmonyOS__门锁品类的临时密码、照片编解码工具技术解析__

项目背景

随着智能家居的普及,使用方便的智能门锁受到广大消费者的欢迎,成为家居应用领域的一大热门。在接入鸿蒙智联智能门锁领域时,技术人员发现用户通过手机给智能门锁设置临时密码时,APP给门锁下发加密后的密码,但设备固件目前尚无与之对应的解密工具,并且智能门锁都具备拍照功能用于保存异常情况的现场照片,所用模组无法直接将照片发送到三方服务保存,这些还处于空白技术领域。

逻辑实现

技术人员通过了解行业情况,查阅大量相关技术资料,自研出专用的解密工具,成功实现了临时密码设置功能;自研出照片编解码工具,利用智能家居云作为中转,实现了手机App照片实时查看功能。接下来我们看所述技术难点是如何实现的。

部分截图展示:

未题-1

  1. 临时密码设置流程

流程图:

智能门锁这临时密码设置流程

流程说明:

  1. 智慧生活APP生成临时密码发送到智能家居云保存,APP加密算法采用RSA的PKSC8加密算法
  2. 智能家居云下发密文给门锁设备
  3. 门锁解密密文,获取临时密码、有效时间,然后保存到锁内,临时密码有效时间最长为7天,最短为30分钟
  4. 临时密码设备设置成功,门锁主动上报设置成功状态
  5. 智能家居云收到状态后转发状态给APP

H5代码实现片段

export default {

data() {

return \{

  TemporarypasswordObj: \{

    Creationtime: '',

    action: '1',

    id: '001',

    sixteenbitSN: '',

    userpassword: '123456', // 管理员密码        

    Temporarypassword: '888888', // 临时密码

    Availabletime: '', // 使用次数

    effectivedate: '',

    Failuretime: ''

  \},

  publicKey: '',

\}

},

methods: {

  saveTemporaryPassword\(\)  \{

  // 构建密码hash数据字符串

  let hashedData = this\.TemporarypasswordObj\.sixteenbitSN \+ 

                   this\.TemporarypasswordObj\.userpassword \+ 

                   this\.TemporarypasswordObj\.Creationtime



  // 进行哈希混淆

  let hashedDatastr = window\.hilink\.sha256Encrypt\(hashedData\)



  // 构建临时密码密文

  let encryptionstringstr =

    this\.TemporarypasswordObj\.Creationtime \+

    this\.TemporarypasswordObj\.action \+

    this\.TemporarypasswordObj\.id \+

    hashedDatastr \+

    this\.TemporarypasswordObj\.Temporarypassword \+

    this\.TemporarypasswordObj\.Availabletime \+

    this\.TemporarypasswordObj\.effectivedate \+

    this\.TemporarypasswordObj\.Failuretime

  

  // 调用hilink接口进行RSA加密

  let cipherText = window\.hilink\.rsaEncrypt\(encryptionstringstr, this\.publicKey\)



  // 发送临时密码

  this\.sendCiphertext\(cipherText\)

\},

sendCiphertext\(cipherText\) \{

  try \{

    let data = \{ remoteCode: \{ cipherText: cipherText \} \}

    window\.hilink\.setDeviceInfo\('0', JSON\.stringify\(data\), 'setInfocallback'\);

    window\.setInfocallback = res => \{

      let data = JSON\.parse\(res\);

      if \(data\.errcode === 0\) \{

        console\.log\('临时密码发送成功'\);

      \} else \{

        console\.log\('临时密码发送失败'\);

      \}

    \}

  \} catch \(e\) \{

    console\.log\(e\)

  \}

\}

}

}

固件代码片段

int smartlock_rsa_decrypt(char * text,unsigned int textlen, const char * pchipertext,unsigned int chiperlen)

{

int ret;

size\_t olen = 0;

size\_t dec\_len = 0;

const char \*pers = "simple\_rsa";

unsigned char \*base\_dec = NULL;

mbedtls\_rsa\_context rsa;

mbedtls\_rsa\_context tempctx;

mbedtls\_entropy\_context entropy;

mbedtls\_ctr\_drbg\_context ctr\_drbg;

mbedtls\_rsa\_init\(&rsa, MBEDTLS\_RSA\_PKCS\_V21, MBEDTLS\_MD\_SHA256\);  // 初始化RSA结构体

mbedtls\_rsa\_init\(&tempctx, MBEDTLS\_RSA\_PKCS\_V21, MBEDTLS\_MD\_SHA256\);  // 初始化RSA结构体

mbedtls\_entropy\_init\(&entropy\);         // 初始化熵结构体

mbedtls\_ctr\_drbg\_init\(&ctr\_drbg\);       // 初始化随机数结构体

ret = mbedtls\_ctr\_drbg\_seed\(&ctr\_drbg, mbedtls\_entropy\_func, &entropy,

                                \(const uint8\_t \*\) pers, strlen\(pers\)\);  // 根据个性化字符串更新种子1

assert\_exit\(ret == 0, ret\);

base\_dec = rsa\_global\_hooks\.rsa\_allocate\(BASE\_DEC\_LEN\);

if\(base\_dec == NULL\)\{

    rsa\_print\_dbg\("malloc base64 buff failed \r\n"\);

    goto err\_exit;

\}

memset\(base\_dec,0,BASE\_DEC\_LEN\);

ret = smartlock\_rsa\_readkeys\(&tempctx\);

assert\_exit\(ret == 0, ret\);

ret = mbedtls\_rsa\_import\( &rsa, &tempctx\.N, &tempctx\.P, &tempctx\.Q, &tempctx\.D, &tempctx\.E\);

assert\_exit\(ret == 0, ret\);

ret = mbedtls\_rsa\_complete\( &rsa \);

assert\_exit\(ret == 0, ret\);

mbedtls\_base64\_decode\(base\_dec,BASE\_DEC\_LEN,&dec\_len,pchipertext,chiperlen\);

ret = mbedtls\_rsa\_pkcs1\_decrypt\(&rsa, mbedtls\_ctr\_drbg\_random, &ctr\_drbg,

                            MBEDTLS\_RSA\_PRIVATE, &olen, base\_dec, text, textlen\);

assert\_exit\(ret == 0, ret\);

text\[olen\] = 0;

rsa\_global\_hooks\.rsa\_deallocate\(base\_dec\);

mbedtls\_ctr\_drbg\_free\(&ctr\_drbg\);

mbedtls\_entropy\_free\(&entropy\);

mbedtls\_rsa\_free\(&tempctx\);

mbedtls\_rsa\_free\(&rsa\);

return 0;

err_exit:

rsa\_global\_hooks\.rsa\_deallocate\(base\_dec\);

mbedtls\_ctr\_drbg\_free\(&ctr\_drbg\);

mbedtls\_entropy\_free\(&entropy\);

mbedtls\_rsa\_free\(&tempctx\);

mbedtls\_rsa\_free\(&rsa\);

return \-1;

}

  1. 照片上报展示

由于门锁模组无法将图片上报到三方服务器,只能利用智能家居云进行中转,而智能家居云profile字符串类型有长度限制,因此需要将数据拆包后分包发送,APP在收到数据后进行数据包合并,最后完成图片显示。

工作流程:

Base64图片数据上报

代码实现片段

以上为智能门锁的解决方案,该方案已转化为鸿蒙智联标准化认证,可广泛应用于门锁、保险箱等产品。

回帖(1)

roadtang

2022-8-15 11:43:53
nice,very gooooooooooooooood

更多回帖

×
发帖