在开发基于Openwrt的路由器的固件加密的时候,想到了使用大部分Linux系统自带的加密软件Openssl去处理固件版本.


本地测试成功

​     在本地主机自我测试时通过Openssl的命令 加密/解密 固件包一切正常.

相关命令如下

1
2
3
4
5
losedeer@xr:~/Mesh_tool/img$ openssl enc -e -aes256 -in firmware.img -out enc_firmware.img -pass pass:123456
losedeer@xr:~/Mesh_tool/img$ openssl enc -d -aes256 -in enc_firmware.img -out dec_firmware.img -pass pass:123456
losedeer@xr:~/Mesh_tool/img$ ls
dec_firmware.img enc_firmware.img firmware.img nand-ipq6018-single.img

    1. 将 firmware.img 通过 openssl aes256 加密成 enc_firmware.img

    2. 再将 enc_firmware.img 解密成 dec_firmware.img

    3. 升级 firmware.img 和升级 dec_firmware.img 的固件版本功能一致,则本地固件加密验证成功


后期问题出现

    后期需要把加密的固件包上传至服务器, 通过 Http 下载至设备解密后完成升级, 可实际每次都会升级失败, 在设备环境中抓取 Log 分析发现是解密失败的问题.

报错信息如下

1
2
3
4
5
ubuntu@vm10-0-11-4:/var/www/html$ openssl enc -d -aes256 -in enc_firmware.img -out dec_firmware.img -pass pass:123456
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
bad decrypt
140633021280704:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:../crypto/evp/evp_enc.c:537:

查询原因

    经过多次测试,发现每次单独在本地以及设备环境中 加密/解密 都不会出问题 , 从而想到是否是环境或者是Openssl 的版本的问题.

    通过如下命令查询 openssl 版本

1
2
losedeer@xr:~/Mesh_tool/img$ openssl version
OpenSSL 1.0.2g 1 Mar 2016

    发现本地的 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
2
3
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
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better

    这样不同环境中的由于Openssl 版本问题造成的加密解密失败问题就解决了~~!