在开发基于Openwrt的路由器的固件加密的时候,想到了使用大部分Linux系统自带的加密软件Openssl去处理固件版本.
本地测试成功
在本地主机自我测试时通过Openssl的命令 加密/解密 固件包一切正常.
相关命令如下
1 | losedeer@xr:~/Mesh_tool/img$ openssl enc -e -aes256 -in firmware.img -out enc_firmware.img -pass pass:123456 |
1. 将 firmware.img 通过 openssl aes256 加密成 enc_firmware.img
2. 再将 enc_firmware.img 解密成 dec_firmware.img
3. 升级 firmware.img 和升级 dec_firmware.img 的固件版本功能一致,则本地固件加密验证成功
后期问题出现
后期需要把加密的固件包上传至服务器, 通过 Http 下载至设备解密后完成升级, 可实际每次都会升级失败, 在设备环境中抓取 Log 分析发现是解密失败的问题.
报错信息如下
1 | ubuntu@vm10-0-11-4:/var/www/html$ openssl enc -d -aes256 -in enc_firmware.img -out dec_firmware.img -pass pass:123456 |
查询原因
经过多次测试,发现每次单独在本地以及设备环境中 加密/解密 都不会出问题 , 从而想到是否是环境或者是Openssl 的版本的问题.
通过如下命令查询 openssl 版本
1 | losedeer@xr:~/Mesh_tool/img$ openssl version |
发现本地的 Openssl 版本为 1.0.2 , 设备环境中的版本为 1.1.1
查找资料发现
在Openssl 1.1之后的版本默认摘要从MD5更改为SHA256, 因此 , 使用 1.0 版本的 Openssl 加密的固件,会在1.1之后的版本解密失败.
Use SHA256 not MD5 as default digest.
解决方案
在Openssl版本过高(> 1.1)的版本中添加 -md md5 参数强制使用md5作为摘要即可.
1 | ubuntu@vm10-0-11-4:/var/www/html$ openssl enc -d -aes256 -in enc_firmware.img -out dec_firmware.img -md md5 -pass pass:123456 |
这样不同环境中的由于Openssl 版本问题造成的加密解密失败问题就解决了~~!