micropython在usb和web的repl都添加密码,一定程度上保护密码

提供简单加密的mpy模块,可以放到固件内部,也可以手动上传到flash。
在主程序或者boot.py调用后,会禁用repl 和 repl的文件管理功能,并在repl上提示输入密码。采用严格的密码放置爆破功能,哪怕6位数字都无法爆破。

兼容webrepl

特性

  • 可以在 usb口的repl 上加上密码,同时webrepl也会增加密码
  • 无密码的情况下,relp口只可以显示打印信息,无法执行python命令,更加无法查看flash内文件
  • 输入密码后,不重启的情况下不需要再次输入密码
  • 可以集成到固件内
  • 可以随意选择在随意boot.py 或者 main.py加载
  • 可以限制密码尝试间隔,并在N次后增加重试间隔时间,简单的密码也很难通过爆破来绕过
  • 依赖:micropython time 和 _thread 三个库

获取和使用

下载 mpy

放到flash 内 或者固件内部均可。 下载地址:https://github.com/joyanhui/file.leiyanhui.com/raw/main/esp32/repl_psw.mpy 暂时不开源,需要源码的请联系 joyanhui@qq.com

修改你的boot.py 或main.py

使得代码保护在开机后可以马上运行。下面是一个 boot.py的演示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import _thread

# 后台运行 main.py 的 run() 函数
def background_run():
    import main
    main.run()

_thread.start_new_thread(background_run, ())

import repl_psw
# (input正确的密码,msg请输入密码,msg密码正确,msg密码错误,msg你想干啥,参数错误无法保护了哦,msg休息一下吧,time密码错误重试间隔时间,times重试几次后强制休息,tims强制休息时间间隔)
# 后面三个参数都是int哦,时间都是秒为单位的哦 其他参数都是字符串并且不能为空哦  
# 为了方便你调试,如果参数类型错误 就直接跳过 不保护了,所以务必保证参数类型都正确   
# repl_psw模块大概需要占用1.2kb的内存 。   
repl_psw.authenticate("111","请输入密码:","ok密码正确","err密码错误,请重新输入。","你想干啥?","参数类型错误肯定就无法保护了哦","别试了休息一会吧",1,3,15)

main.py的代码应该是你的业务逻辑部分,简单的一个实例如下

1
2
3
4
5
6
7
8
9
from machine import Pin
import time
led = Pin(15, Pin.OUT)
def run():
    while True:
        led.on() 
        time.sleep(0.5)
        led.off() 
        time.sleep(0.5) 

其他建议

上面的演示代码只是提供了一个简单的例子,实际使用的时候,密码最好与设备的mac地址或token关联 或者从单独的授权服务器获取,做到一机一密
在esp8266 等内存较少的micropython设备上,使用 _thread 可能比较奢侈,请自己选择是否使用 repl_psw模块大概需要占用1.2kb的内存 。
repl 的加密,只能一定程度上保护代码,只是提供简单灵活的方式防止别人直接窥视你的代码。无法避免绕过repl直接从物理层面下手的
建议 核心代码还是用c来写,并不是非常核心的代码 编译成mpy放到固件内部。 如果代码安全性要求非常高,还是要用加密芯片的昂。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计