本文正在參加星光計劃3.0—夏日挑戰賽
項目背景
随着智能家居的普及,友善快捷的智能門鎖受到廣大消費者的歡迎,成為家居應用領域的一大熱門。在接入鴻蒙智聯智能門鎖領域時,我們的技術人員發現使用者在通過手機給智能門鎖設定臨時密碼,APP給門鎖下發加密後的密碼時,裝置固件目前尚無與之對應的解密工具,并且智能門鎖都具備拍照功能用于儲存異常情況的現場照片,所用模組無法直接将照片發送到三方服務儲存,這些還處于空白技術領域。
邏輯實作
技術人員通過了解行業情況,查閱大量相關技術資料,自研出專用的解密工具,成功實作了臨時密碼設定功能;自研出照片編解碼工具,利用智能家居雲作為中轉,實作了手機App照片實時檢視功能。接下來我們看所述技術難點是如何實作的。
部分截圖展示:
一、臨時密碼設定流程
流程圖:
流程說明:
1.智慧生活APP生成臨時密碼發送到智能家居雲儲存,APP加密算法采用RSA的PKSC8加密算法
2.智能家居雲下發密文給門鎖裝置
3.門鎖解密密文,擷取臨時密碼、有效時間,然後儲存到鎖内,臨時密碼有效時間最長為7天,最短為30分鐘
4.臨時密碼裝置設定成功,門鎖主動上報設定成功狀态
5.智能家居雲收到狀态後轉發狀态給APP
H5代碼實作片段:
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 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在收到資料後進行資料包合并,最後完成圖檔顯示。
工作流程:
代碼實作片段
<img :src="picSrc" width="400" height="300" />
</template>
<script>
export default {
data() {
return {
picSrc: '',
picBase64: '',
index: 0,
}
},
created() {
this.deviceEvent()
},
method: {
deviceEvent() {
try {
window.deviceEventCallback = event => {
let eventJson = JSON.parse(event)
if (eventJson.sid.indexOf('imagePack') > -1) {
this.picBase64 += eventJson.data['image']
this.index ++
}
if (this.index === 6) {
this.picSrc = 'data:image/jpg;base64,' + this.picBase64
}
}
} catch (e) {
console.log(e)
}
}
},
}
</script>
以上為智能門鎖的解決方案,該方案已轉化為鴻蒙智聯标準化認證,可廣泛應用于門鎖、保險箱等産品。