STM32 加密思考
STM32的加密思路
- 使用系统启动程序STM32 Flash Loader demonstrator将Flash设置为读保护。
所有以调试工具、内置SRAM或FSMC执行代码等方式对主存储器访问的操作将被禁止,只允许用户代码对主Flash存储器的读操作和编程操作(除了Flash开始的4KB区域不能编程)。用户代码允许自主编程可以实现IAP或者数据存储等功能。
这样破解者将不能用调试工具、内置SRAM或者FSMC执行代码等方式读出Flash中的代码。破解者也不能使用系统启动程序读取代码,因为要解除读保护,将执行整个芯片的擦除操作。 - 主程序中使用设备ID保护
即使将Flash设置为读保护,破解者也可以通过IAP下载自己的一段小程序,从而读出Flash中的内容。因此,还需要利用设备的唯一ID进行加密保护。在主程序中,加入对设备唯一ID的检测,这样即使破解者读出了芯片中的二进制码,也不能用这个二进制码去复制新的器件。
具体实现方法:
a. 在应用程序中定义1个(32位甚至更多)const变量,变量值全为0xFF。每次启动程序时,检查const变量值如果全为0xFF,就读器件的唯一ID,通过Flash编程写入该const变量中(因为全是0xFF,所以可以编程写入)。
b. 在程序中多个地方检查const变量,如果变量值不为0xFF并且与设备ID不一致,就执行与功能无关代码(比如自擦除)。
这样,即使破解者读出了芯片中的二进制码,因为这份二进制码包含了设备唯一ID,具有唯一性,所以不能复制到其他芯片中。
为了避免破解者利用反汇编,根据芯片ID数据在二进制文件中查找对应相同数据的位置从而破解,可以将ID拆散成不同的组合,并且写到不同且不连续的地方。更进一步,可在程序中检测多份这样的分散ID,以增加反汇编的难度。或者将CPUID进行加密,Flash中存储加密后的结果。 - 固件的加密。有两种方案:一是传输过程的加密,另外一种是固件镜像的加密。具体方案待补充。
程序加密的实现
//加密后的CPUID
volatile const static uint32 CPUIDEncrypt = 0xFFFFFFFF;//写入加密数据
void WriteEncrypt(void)
{//第一次烧写:将UID写入到Flash中if(CPUIDEncrypt==0xFFFFFFFF){uint32_t CpuID[3];//获取CPU唯一的IDCpuID[0]=*(vu32*)(UID_BASE);CpuID[1]=*(vu32*)(UID_BASE+4);CpuID[2]=*(vu32*)(UID_BASE+8);//加密算法,很简单的加密算法uint32_t EncryptCode=(CpuID[0]>>3)+(CpuID[1]>>1)+(CpuID[2]>>2);FLASH_Unlock();FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);FLASH_ProgramWord((uint32_t)&CPUIDEncrypt, EncryptCode);FLASH_Lock();}
}
//判断加密
bool JudgeEncrypt(void)
{uint32_t CpuID[4];//获取CPU唯一的IDCpuID[0]=*(vu32*)(UID_BASE);CpuID[1]=*(vu32*)(UID_BASE+4);CpuID[2]=*(vu32*)(UID_BASE+8);//加密算法,很简单的加密算法CpuID[3]=(CpuID[0]>>3)+(CpuID[1]>>1)+(CpuID[2]>>2);//检查Flash中的UID是否合法return (CPUIDEncrypt == CpuID[3]);
}
- 将写入加密数据和判断加密两个功能分开。写入加密在PrsCtrlTask开始的地方;而判断加密分布到程序的各个角落。
- 非常重要的是CPUID加密值的定义一定要加“volatile”类型,否则按速度优化编译,在判断加密值,不会重新读取加密值,导致判断出错。
volatile const static uint32 CPUIDEncrypt = 0xFFFFFFFF;
- 在工程选项Options->Debugger->Download中选择: use flash loader,否则主程序中对Flash编程将不成功。
[未完待续]
STM32 加密思考相关推荐
- STM32加密保护工具 | STM32Trust介绍、解决方案
视频号 | strongerHuang 微信公众号 | strongerHuang 物联网时代,因为要联网就牵涉到一个重要的问题,那就是安全,你会发现近两三年各MCU厂商都在推自己的安全芯片. 本文就 ...
- python-hashlib模块-加密
功能介绍: 数据加密 只能加密,不能解密 应用场景: 用户密码加密 思考,加密后看不懂,改密码该怎么办? 如何验证? 导入hashlib模块 模块的导入 import hashlib md5加密 &g ...
- (1)非对称加密——RSA——史上最通俗的小白可看懂!
摘要 我身边有几个年龄分布在4-6岁的小朋友.由于他们还都不能熟练地掌握100以内的加减法,所以我原计划的对称加密,在他们看来还是有点难.那非对称加密呢,需要他们能熟练进行三位数的乘法,我想就可以逐步 ...
- 从智能锁谈STM32安全技术
一. 智能锁的安全分析 1.1 安全的概念与保护的对象 1.1.1 什么是安全 安全分为2类: 功能安全 Functional Safety 保护系统不受那些随机故障或者系统设计缺陷的影响 信息安全 ...
- seafile安装教程mysql密码_Seafile安装踩坑
欢迎大家访问我的博客新地址: 至于为什么要搭建私有云盘,或许就是因为前段时间360个人网盘下架的原因吧,事情过去很久了,我也在摸索方案,最后还是选择了百度云,或许是因为百度说过我们百度云不会倒下的,哈 ...
- [转]信息安全相关理论题(二)
27.在工程实施之前,验收方可以不给施工方弱电布线图纸,但施工结束后必须有图纸 A. 对 B. 错 您的答案: 标准答案: B 28.在OSI七层协议中,提供一种建立连接并有序传输数据的方法的层是 A ...
- 【滴水三期】--公开课
课程思想:用逆向的思维学习正向,而不是用正向的思维学习逆向 滴水逆向课程体系: 第一章 进制.寄存器与汇编指令 第二章 C语言 第三章 硬编码 第四章 C++与MFC 第五章 Win32 A ...
- stm32cubeIDE的使用
stm32官方出了个免费的IDE,可以很方便地配置(初始化)stm32项目. 文章目录 安装相关 安装 st-link utility 安装 工程.芯片配置流程 flash相关 读写保护 flash的 ...
- 关于STM32驱动DS1302实时时钟的一点思考
关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...
最新文章
- c语言把地址用%d输出字符串,C语言必须要记住的经典程序
- server 2008访问Server 2003数据慢
- 关于《大道至简》第一章的收获
- 永劫无间大神玩家ZX迷恋上单人三排,单局28杀,过程太过瘾了
- 计算机类农学类牧医类,考生注意!2017年高考报考类别确定
- cuda 5.0配置vs2008+Visual Assist X +安装问题解决
- VXWORKS 几种定时机制
- Redis简单案例(三) 连续登陆活动的简单实现
- 小米MIX 4屏幕规格曝光:华星光电1080P面板 或支持屏下摄像
- Rickie的软件测试学习笔记-第四周
- 147.对链表进行插入排序
- gaster字体转换器_Galas字体转换器 Galas在线生成器-万字网
- WEP无线网络密码破解
- Ordering disordered structures
- zzzfun网站连接不上服务器,zzzfun网页版
- Bouncy Castle 密码包的配置及使用详解
- 权限管理框架实现(1)--Struts切面处理
- c#NPOI操作word小心得
- acwing 4269.校庆(map)
- 刚入行的 可以了解下什么是物理机和虚拟机 租用和托管 ——世通兰陵王为你解答