1
HarmonyOS__门锁品类的临时密码、照片编解码工具技术解析__
项目背景
随着智能家居的普及,使用方便的智能门锁受到广大消费者的欢迎,成为家居应用领域的一大热门。在接入鸿蒙智联智能门锁领域时,技术人员发现用户通过手机给智能门锁设置临时密码时,APP给门锁下发加密后的密码,但设备固件目前尚无与之对应的解密工具,并且智能门锁都具备拍照功能用于保存异常情况的现场照片,所用模组无法直接将照片发送到三方服务保存,这些还处于空白技术领域。
逻辑实现
技术人员通过了解行业情况,查阅大量相关技术资料,自研出专用的解密工具,成功实现了临时密码设置功能;自研出照片编解码工具,利用智能家居云作为中转,实现了手机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;
}
由于门锁模组无法将图片上报到三方服务器,只能利用智能家居云进行中转,而智能家居云profile字符串类型有长度限制,因此需要将数据拆包后分包发送,APP在收到数据后进行数据包合并,最后完成图片显示。
工作流程:
代码实现片段
以上为智能门锁的解决方案,该方案已转化为鸿蒙智联标准化认证,可广泛应用于门锁、保险箱等产品。