【嵌入式】使用嵌入式芯片唯一ID进行程序加密实现

目录

一 背景说明

二 原理介绍

三 设计实现

四 参考资料


一 背景说明

        项目程序需要进行加密处理

        考虑利用嵌入式芯片的唯一UID,结合Flash读写来实现

        加密后的程序,可以使得从芯片Flash中读取出来的文件(一般为HEX格式)不能用于其他的芯片。

二 原理介绍

        【1】芯片唯一ID

        芯片提供了器件电子签名,即唯一身份标识。该信息存储在产品唯一身份标识寄存器中:

        UID寄存器描述如下:

        其中,UID1、UID2均为16位,UID3为32位,UID4为32位。        

        这样就可以从0x0x1FFFF7E8地址读取3个32bit的数据,获取它的唯一ID

        【2】程序加密逻辑说明

        在讲解简单的程序加密方法之前,先了解一下通常的MCU程序复制方法。

        通过烧写器(或者其他手段),将MCU内部程序存储区中的内容全部读出,就获取了烧写文件。如果烧写文件没有被加密,则可以直接将它烧写到别的MCU中运行,就完成了复制

        有没有办法可以使得对方即使获取了烧写文件,也不能直接烧写到别的MCU中运行呢?

        我们可以利用芯片的唯一ID来实现一种简单的程序加密方法。由于每个芯片的唯一ID是不同的,我们只要在程序中检查ID的合法性即可,主要的步骤如下:

        (i)程序首次运行时,读出芯片的唯一ID;

        (ii)将ID使用加密算法,计算出一个特殊值,写入到非易失存储区中(需要掉电能保存);

        (iii)以后每次运行时,读出芯片唯一ID,通过算法计算后,与非易失存储区中保存的值比对,如果一致,则正常运行;如果不对,停止运行。

        由于每个芯片中的ID是不同的,由加密算法算出的值也是不同的,所以,即使有人获取了我们的烧写文件,烧写到另一片MCU中,由于ID不同,最后也会比对出错,无法执行。

        

三 设计实现

        【1】编写获取并加密ID的接口:

#define UID_BASE (0x1FFFF7E8)/**************************************************************************
* 函数名称: getEncryptID
* 功能描述: 获取并加密ID
**************************************************************************/
u32 getEncryptID(u32 *p_id)
{p_id[0] = *(vu32*)(UID_BASE);p_id[1] = *(vu32*)(UID_BASE + 4);p_id[2] = *(vu32*)(UID_BASE + 8);return ((p_id[0] >> 3) + (p_id[1] >> 1) + (p_id[2] >> 2));  //加密算法
}

        【2】编写判断加密ID的接口:

const u32 uid_save = 0xFFFFFFFF;    //CPUID保存/**************************************************************************
* 函数名称: judgeEncryptID
* 功能描述: 判断加密ID
**************************************************************************/
u8 judgeEncryptID(void)
{u32 t_encid;u32 t_cpuid[3];u32 t_addr = 0;u32 t_flashid;t_encid = getEncryptID(t_cpuid);    //读本机UIDt_addr = (u32)&uid_save;if(*(vu32 *)t_addr == 0xFFFFFFFF)   //第一次烧写将加密后的UID写入FLASH{FLASH_Unlock();FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);FLASH_ProgramWord(t_addr, t_encid);FLASH_Lock();}t_flashid = *(vu32 *)t_addr;        //第一次上电存完了之后需要再读一遍return (t_flashid == t_encid);
}

        【3】主函数初始化中执行上面的判断:

void main(void)
{//...//判断加密UID(若不匹配,则报错并陷入死循环)if(! judgeEncryptID()){while(1);}while(1){//主循环}
}

        【注意点】:

                (i)注意 const u32 uid_save 的类型定义,我使用的 keil 环境中不能加 volatile 修饰,如果加了会被定义到RAM区,而非Flash区,这样起不到加密的效果

                        如果用的是IAR环境,可能必须加 volatile 修饰,同时工程选项Options->Debugger->Download中选择: use flash loader。不这样做的后果是按速度优化编译,再判断加密值,不会重新读取加密值,导致判断出错

                (ii)注意 const u32 uid_save 的初始化值定义为全F,和擦除后的状态一致,所以程序中省略了擦除的操作,可以直接写入

                (iii)唯一ID存储地址 0x1FFFF7E8 应该尽量隐蔽,尽量避免在程序中直接出现该值

                更好的做法可以参考下面的方案:

/**************************************************************************
* 函数名称: getEncryptID
* 功能描述: 获取并加密ID
**************************************************************************/
u32 getEncryptID(u32 *p_id)
{volatile u32 UID_BASE;UID_BASE = 0x20000006;    //让逆向的人误以为是ram变量UID_BASE -= 0x800; UID_BASE -= 0x1e;         //等于id的基地址0x1FFFF7E8p_id[0] = *(vu32*)(UID_BASE);p_id[1] = *(vu32*)(UID_BASE + 4);p_id[2] = *(vu32*)(UID_BASE + 8);return ((p_id[0] >> 3) + (p_id[1] >> 1) + (p_id[2] >> 2));  //加密算法
}

四 参考资料

        【1】STM32 的加密实现_stn32加密-CSDN博客

        【2】【STM32+cubemx】0025 HAL库开发:唯一ID获取和简单的程序加密_mcu唯一uid加密-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/142726.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rsync+inotify实时同步数据

一、相关简介 1、rsync(remote synchronize) rsync是 Liunx/Unix 下的一个远程数据同步工具,它可通过 LAN/WAN 快速同步多台主机间的文件和目录。   Linux 之间同步文件一般有两种方式,分别是 rsync 与 scp ,scp 相…

前端性能优化汇总

1.减少HTTP请求次数和请求的大小 (三大类) 文件的合并和压缩:(1)(6) 延迟加载:(3)(4) 用新的文件格式代替传统文件格式:&a…

基于LQR算法的一阶倒立摆控制

1. 一阶倒立摆建模 2. 数学模型 倒立摆的受力分析网上有很多,这里就不再叙述。直接放线性化后的方程: F (Mm)x″-mLφ″ (ImL)φ″ mLx″ mgLφ(F为外力,x为物块位移,M,m为物块和摆杆的质量,…

抽象轻松java

嗨嗨嗨! 没想到吧,出现了抽象轻松第4种语言系列(我也没想到) 简单的java程序,看完就懂的简单逻辑——购物车系统 购物车,首先要有商品吧,现实中的商品有什么属性? 名字&#xff0…

CSS详细基础(一)选择器基础

本帖开始,我们来介绍CSS——即,层叠样式表~ 层叠样式表是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。简单的说,层叠就是对一个元…

PostgreSQL 查询某个属性相同内容出现的次数

查询某个数据库表属性 name 相同内容出现出现的次数,并按次数从大到小排序 SELECT name, COUNT(*) AS count FROM your_table GROUP BY name ORDER BY count DESC;示例 select project_id, COUNT(*) AS count from app_ads_positions group by project_id order b…

认证-authentication 和授权-authorization

就好比你可以刷卡进去xxx大厦(认证是本公司职员),但无法刷卡进入金融部门,或 实验部门(因为没有授权)

vite跨域proxy设置与开发、生产环境的接口配置,接口在生产环境下,还能使用proxy代理地址吗

文章目录 vite的proxy开发环境设置如果后端没有提供可以替换的/mis等可替换的后缀的处理办法接口如何区分.env.development开发和.env.production生产环境接口在生产环境下,还能使用proxy代理地址吗? vite的proxy开发环境设置 环境: vite 4…

玩转Mysql系列 - 第22篇:mysql索引原理详解

这是Mysql系列第22篇。 背景 使用mysql最多的就是查询,我们迫切的希望mysql能查询的更快一些,我们经常用到的查询有: 按照id查询唯一一条记录 按照某些个字段查询对应的记录 查找某个范围的所有记录(between and) …

忽视日志吃大亏,手把手教你玩转 SpringBoot 日志

一、日志重要吗 程序中的日志重要吗? 在回答这个问题前,笔者先说个事例: ❝ 笔者印象尤深的就是去年某个同事,收到了客户反馈的紧急bug。尽管申请到了日志文件,但因为很多关键步骤没有打印日志,导致排查进…

win10 使用cmake + mingw编译LAPACK

参考官网的内容: 适用于视窗的 LAPACK (utk.edu) 第一步下载好源码包: 配置好mingw的路径添加到环境变量中 gcc --version 出现这些就行了. 还有就是吧mingw中的mingw-make.exe重命名为make.exe 下载安装cmake 然后打开 1是源码路径,路径中一定要有CMakeLists.txt如果没…

Java多线程篇(6)——AQS之ReentrantLock

文章目录 1、管程2、AQS3、ReentrantLock3.1、lock/unlock3.1.1、lock3.1.2、unlock 3.2、一些思考 1、管程 什么是管程? 管理协调多个线程对共享资源的访问,是一种高级的同步机制。 有哪些管程模型? hansen:唤醒其他线程的代码…

渗透测试中的前端调试(一)

前言 前端调试是安全测试的重要组成部分。它能够帮助我们掌握网页的运行原理,包括js脚本的逻辑、加解密的方法、网络请求的参数等。利用这些信息,我们就可以更准确地发现网站的漏洞,制定出有效的攻击策略。前端知识对于安全来说,…

Pytorch单机多卡分布式训练

Pytorch单机多卡分布式训练 数据并行: DP和DDP 这两个都是pytorch下实现多GPU训练的库,DP是pytorch以前实现的库,现在官方更推荐使用DDP,即使是单机训练也比DP快。 DataParallel(DP) 只支持单进程多线程…

3、嵌入式系统的启动过程(BoodLoader)

1、系统启动过程 通电 - > 执行BootLoader - > 加载内核 - > 挂在根文件系统 - > 执行应用程序 Windows的启动过程: 通电 - > 执行BIOS - > 加载WinNT内核 - > 挂在文件系统 - > 执行应用程序 二、嵌入式系统的结构 BootLoader 1、BootL…

ElasticSearch - 基于 DSL 、JavaRestClient 实现数据聚合

目录 一、数据聚合 1.1、基本概念 1.1.1、聚合分类 1.1.2、特点 1.2、DSL 实现 Bucket 聚合 1.2.1、Bucket 聚合基础语法 1.2.2、Bucket 聚合结果排序 1.2.3、Bucket 聚合限定范围 1.3、DSL 实现 Metrics 聚合 1.4、基于 JavaRestClient 实现聚合 1.4.1、组装请求 1…

Tomcat多实例、负载均衡、动静分离

Tomcat多实例部署 安装jdk [rootlocalhost ~]#systemctl stop firewalld.service [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#cd /opt [rootlocalhost opt]#ls apache-tomcat-8.5.16.tar.gz jdk-8u91-linux-x64.tar.gz rh [rootlocalhost opt]#tar xf jdk-8u91-linu…

春招秋招,大学生求职容易遇到哪些问题?

每到毕业季就有大批大学生从校园出来,他们怀抱梦想,希望能做出一番成绩。但现实总归是残酷的,有些人找不到工作,有一些人频繁跳槽,也有一些人最终找到的工作与自己的专业没有一点关系,迷茫好几年才找到方向…

钡铼BL302与PLC:提升酿酒业效率与品质的利器

啤酒是人类非常古老的酒精饮料,是水和茶之后世界上消耗量排名第三的饮料。 啤酒在生产过程中主要有制造麦芽、粉碎原料、糖化、发酵、贮酒後熟、过滤、灌装包装等工序流程。需要用到风选机、筛分机、糖化锅、发酵设备、过滤机、灌装机、包装机等食品机械设备。这些食…

安全远程访问工具

什么是安全远程访问 安全远程访问是指一种 IT 安全策略,允许对企业网络、任务关键型系统或任何机密数据进行授权、受控访问。它使 IT 团队能够根据员工和第三方的角色和工作职责为其提供不同级别的访问权限,安全的远程访问方法可保护系统和应用程序&…