stm32的几种读保护措施讲解

综合网上讲解的几种读保护措施,这里简单总结下:

采用stm32唯一ID作为加密的字符,使用固定密码,采用16位字节AES加密的方式生成密文,然后写进flash,,app程序执行的时候需要判断读取的stm32唯一ID号和AES解密出来是否一致,是执行程序,否则不执行,测试过,但这个方案针对生产比较麻烦,这里不采用

 

ChipUniqueID[2] = *(__IO u32 *)(0X1FFFF7F0); // 高字节

ChipUniqueID[1] = *(__IO u32 *)(0X1FFFF7EC); //

ChipUniqueID[0] = *(__IO u32 *)(0X1FFFF7E8); // 低字节

ChipUniqueID[3] = 0xffffffff;

printf("rn########### 芯片的唯一ID为: %X-%X-%X-%X\n",

          ChipUniqueID[0],ChipUniqueID[1],ChipUniqueID[2],ChipUniqueID[3]);

memcpy(aesKey , "chenjianqun66666" ,16);  //AES加密密钥,16字节(128bit)

memset(expressText ,0 ,1024);

memset(expressText ,0 ,1024);

AES_Decrypt(expressText , cipherText , aesKey);//useaesKey decrypt 解密

        

count[0] =((u32)expressText[3]<<24)|((u32)expressText[2]<<16)|((u32)expressText[1]<<8)|((u32)expressText[0]);

count[1] =((u32)expressText[7]<<24)|((u32)expressText[6]<<16)|((u32)expressText[5]<<8)|((u32)expressText[4]);

count[2] =((u32)expressText[11]<<24)|((u32)expressText[10]<<16)|((u32)expressText[9]<<8)|((u32)expressText[8]);

if((count[0] == flash[0])&&(count[1]== flash [1])&&(count[2] == flash [2]))

{

//App程序

}

方案二:

采用stm32内部flash读保护函数进行读保护,此时板卡芯片不能读写也不能烧录,所以再设计方面需要外部触发信号关闭读保护并且擦除flash的程序,(可以采用按键的触发方式,当按键按下的时候,度保护关闭并擦除)此时可以再次读写和烧录。(待测试)

 

if(GPIO_ReadInputDataBit(GPIOA , GPIO_Pin_0))

{

   if(FLASH_GetReadOutProtectionStatus()!=RESET)

    {

                             FLASH_Unlock();

                             FLASH_ReadOutProtection(DISABLE);

                           //  FLASH_EraseAllPages();   //解除读保护的时候擦除所有

                             FLASH_Lock();//上锁

    }       

}

else{

          if(FLASH_GetReadOutProtectionStatus()!=SET)

    {

                            FLASH_Unlock();//不解锁FALSH也可设置读保护

                            FLASH_ReadOutProtection(ENABLE);

                            FLASH_Lock();//上锁

    }

}

这里也可以采用在内部的ram中烧进一段代码,用于取消读保护和擦除,需要再次烧录的时候,使用

Boot0 ,boot1进入ram启动状态即可

方案三:

另一种方式修改flash的选项字节(Option type) 官方工具stlink utility(可以参考https://blog.csdn.net/hxiaohai/article/details/78546431?fps=1&locationNum=5)也是修改这个的保护等级,但是103的好像不行(从以下文件中可以看到103系列并没有选项字节文件,加密方式只能选用上述的方案二,但是207的读保护方式因为没有103在方案二的函数,所以只能设置选项字节)修改STM32F2xx_OPT.s  中RDP寄存器的0xAA,为0x00,注意:这里不可以修改为0xCC0xCC为最高等级,这个值的修改会导致芯片变成砖头

根据网上的资料:http://www.51hei.com/mcu/2767.html  工程中加入opt.s文件既可以实现对flash的加密,但是解密的时候还是需要用stlink的官方工具stlink utility进行设置,要不然就需要在sram里面设置一份设置选项字节为默认出厂形式才可以再次烧录读写

 

207xx/40xx芯片


103芯片:



  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32Cube是STMicroelectronics公司推出的一个软件工具,用于快速开发STM32微控制器的应用程序。在STM32Cube中,有一个功能叫做Flash保护,可以用来保护系统的程序代码和数据不被非授权的访问所破坏。 Flash保护是通过设置Flash Memory的保护选项来实现的。STM32Cube提供了两种类型的Flash保护:全片保护和可获取保护。 全片保护是指将整个Flash Memory都设置为只模式,即对整个存储器空间进行保护,不允许对其进行写操作。这种保护模式适用于对代码和数据进行完全防护的应用场景。 可获取保护是指将Flash Memory的某一特定地址范围设置为只模式,这样只有在特定的地址范围内的数据才受到保护,其他地址范围的数据仍然可以进行写操作。这种保护模式适用于对特定的关键代码或数据进行保护的应用场景。 在STM32Cube中,开启Flash保护的方式是通过在HAL库中调用相应的函数来实现的。用户可以根据自己的需求选择适合的保护模式,并通过设置相关参数来达到保护Flash Memory的目的。 需要注意的是,一旦Flash保护开启后,除非通过特殊的方式将其关闭,否则在运行时是无法修改保护设置的。因此,在选择开启Flash保护之前,需要仔细考虑是否确实需要对代码和数据进行保护,并确保在开启之后不会再次需要对其进行修改。 总之,STM32Cube的Flash保护功能能够有效地保护系统的程序代码和数据不被非授权的访问所破坏,提高了系统的安全性和稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值