diff --git "a/\345\233\275\346\260\221\345\267\245\344\275\234\350\277\233\345\261\225\345\221\250\346\212\245/Log_yjc.md" "b/\345\233\275\346\260\221\345\267\245\344\275\234\350\277\233\345\261\225\345\221\250\346\212\245/Log_yjc.md" index a4a92d23ff01539dd214ef3971c9f6122e94e6d4..37a8fa22d62a0bf0f1373a5f380ae9388a5985b2 100644 --- "a/\345\233\275\346\260\221\345\267\245\344\275\234\350\277\233\345\261\225\345\221\250\346\212\245/Log_yjc.md" +++ "b/\345\233\275\346\260\221\345\267\245\344\275\234\350\277\233\345\261\225\345\221\250\346\212\245/Log_yjc.md" @@ -1,84 +1,84 @@ -[1月11日] - -早上: -规范补充了中转脚本的代码,优化了数据结构 -写了服务器的接受接口,简单返回了错误信息 -1. 完成了对数据结构的识别,如果结构有误在网关处拦截 - -[1月10日] - -1. 今天主要对齐了之后的计划和时间节点,对后续工作有合理性的安排 -2. 编写了中转脚本的简单版。明天计划写服务器的接收接口 - -[1月4日-1月7日] - -1. hzh入职,周二帮他解决了一下公司的问题。 -2. 周四的时候与贾工对齐了一下注册与通信的流程,DH密钥交换那里先待定,主要的解决是用SSL/TLS加密,消息认证那里采用数字签名,所以要交换公钥对。 -3. PCA那里解决了文件输出出现的数据异常的问题,问题在于不能初始化HEADER的参数,因为result的参数与初始的参数不一样,置空让他自己生成就可以解决。 - -[12月27日-12月31日] - -27日病假 - -这周生病,不在状态。简单处理了开题报告的定稿,与老师对接了报告的相关问题,解决了相关格式存在的问题,提交到系统 - -对设备的注册流程设计第一版方案,详细见[开发前准备](../开发手册/开发手册及疑问集合.md) - -PCA方面 - -1. 经过上周发现的问题,做出调整,修改了处理代码,先归类整理,后输出参数。 -2. 输出发现了主要的问题,在输出文件前的数据为正常值,但是输出文件后出现了函数极大极小的极端值,导致曲线无法正常显示。 -3. 初步定位是trace文件HEADER的问题 - -[12月20日-12月24日] - -例会记录 - -1. 上周处理的traces有问题,应该为4条1组,先初步将4条分组后输出traces文件初步分析 -2. 应该抓紧撰写开题报告的工作 -3. 这周主要完成密码学的学习和对物联网攻击手段的调研,以及初步设计攻防手段 - -本周计划 - -1. 继续学习密码学 -2. 系统学习完密码学后将加工给的密码学与密码算法相关论文读一遍 -3. 研究物联网常用的攻击手段,参考国内外在用的成熟的物联网身份认证的解决方案 -4. 写开题报告 - -[12月13日-12月17日] - -本周计划 - -1. 开会讨论毕设安全方向 -2. 对杨威提供的曲线进行降噪尝试 - -周报: - -1. 周一的时候与贾工讨论过未来几周的计划安排,在目前简单通信完成的情况下,初步定下先从加密协议设计与物联网攻防角度进行准备 -2. 查阅相关博客与论文。在学习过程中,发现自己对密码学的概念不熟悉,故先系统性的学习密码学 -3. 从学校图书馆借阅《图灵·图解密码技术》,边学习边整理笔记,为以后的加密方案设计作准备 -4. PCA方面已经完成了杨工给的曲线集,对10000条曲线进行训练降噪,已大致呈现其曲线 - -[12月6日-12月10日] - -PCA 滤波调研 - -1. 跟进进度 -2. 找一下Demo测试一下数据 - -毕设进度 - -1. 采用了树莓派3当作网关设备,在树莓派3上搭建了MQTT服务器 -2. 搭建了Django基本环境 - -这周计划 - -1. 利用python编写脚本,搭建简单中转环境 -2. Django处理从树莓派收到的信息,进行展示 - -问题: - -1. MQTT服务器如何获取当前在线终端数量? - 网上查到一些是让客户机每次链接获取代理的时候发布一个status的主题,然后持久化这个状态 -2. Django实现一个接口将数据存入数据库 - 前端用轮询展示 +[1月11日] + +早上: +规范补充了中转脚本的代码,优化了数据结构 +写了服务器的接受接口,简单返回了错误信息 +1. 完成了对数据结构的识别,如果结构有误在网关处拦截 + +[1月10日] + +1. 今天主要对齐了之后的计划和时间节点,对后续工作有合理性的安排 +2. 编写了中转脚本的简单版。明天计划写服务器的接收接口 + +[1月4日-1月7日] + +1. hzh入职,周二帮他解决了一下公司的问题。 +2. 周四的时候与贾工对齐了一下注册与通信的流程,DH密钥交换那里先待定,主要的解决是用SSL/TLS加密,消息认证那里采用数字签名,所以要交换公钥对。 +3. PCA那里解决了文件输出出现的数据异常的问题,问题在于不能初始化HEADER的参数,因为result的参数与初始的参数不一样,置空让他自己生成就可以解决。 + +[12月27日-12月31日] + +27日病假 + +这周生病,不在状态。简单处理了开题报告的定稿,与老师对接了报告的相关问题,解决了相关格式存在的问题,提交到系统 + +对设备的注册流程设计第一版方案,详细见[开发前准备](../开发手册/开发手册及疑问集合.md) + +PCA方面 + +1. 经过上周发现的问题,做出调整,修改了处理代码,先归类整理,后输出参数。 +2. 输出发现了主要的问题,在输出文件前的数据为正常值,但是输出文件后出现了函数极大极小的极端值,导致曲线无法正常显示。 +3. 初步定位是trace文件HEADER的问题 + +[12月20日-12月24日] + +例会记录 + +1. 上周处理的traces有问题,应该为4条1组,先初步将4条分组后输出traces文件初步分析 +2. 应该抓紧撰写开题报告的工作 +3. 这周主要完成密码学的学习和对物联网攻击手段的调研,以及初步设计攻防手段 + +本周计划 + +1. 继续学习密码学 +2. 系统学习完密码学后将加工给的密码学与密码算法相关论文读一遍 +3. 研究物联网常用的攻击手段,参考国内外在用的成熟的物联网身份认证的解决方案 +4. 写开题报告 + +[12月13日-12月17日] + +本周计划 + +1. 开会讨论毕设安全方向 +2. 对杨威提供的曲线进行降噪尝试 + +周报: + +1. 周一的时候与贾工讨论过未来几周的计划安排,在目前简单通信完成的情况下,初步定下先从加密协议设计与物联网攻防角度进行准备 +2. 查阅相关博客与论文。在学习过程中,发现自己对密码学的概念不熟悉,故先系统性的学习密码学 +3. 从学校图书馆借阅《图灵·图解密码技术》,边学习边整理笔记,为以后的加密方案设计作准备 +4. PCA方面已经完成了杨工给的曲线集,对10000条曲线进行训练降噪,已大致呈现其曲线 + +[12月6日-12月10日] + +PCA 滤波调研 + +1. 跟进进度 +2. 找一下Demo测试一下数据 + +毕设进度 + +1. 采用了树莓派3当作网关设备,在树莓派3上搭建了MQTT服务器 +2. 搭建了Django基本环境 + +这周计划 + +1. 利用python编写脚本,搭建简单中转环境 +2. Django处理从树莓派收到的信息,进行展示 + +问题: + +1. MQTT服务器如何获取当前在线终端数量? + 网上查到一些是让客户机每次链接获取代理的时候发布一个status的主题,然后持久化这个状态 +2. Django实现一个接口将数据存入数据库 + 前端用轮询展示 diff --git "a/\345\233\275\346\260\221\345\267\245\344\275\234\350\277\233\345\261\225\345\221\250\346\212\245/Todo_hzh.txt" "b/\345\233\275\346\260\221\345\267\245\344\275\234\350\277\233\345\261\225\345\221\250\346\212\245/Todo_hzh.txt" index 59733a460c3d54325fe8f530f191ca1fdb9f11ce..82196c2fe81e2d4b26f0d1b0927c5c5d522f9ed6 100644 --- "a/\345\233\275\346\260\221\345\267\245\344\275\234\350\277\233\345\261\225\345\221\250\346\212\245/Todo_hzh.txt" +++ "b/\345\233\275\346\260\221\345\267\245\344\275\234\350\277\233\345\261\225\345\221\250\346\212\245/Todo_hzh.txt" @@ -1,154 +1,213 @@ -[2022年1月14日 周五] -[任务简述] [09点45分] -1. 烧录吧,累了 -2. [14点34分] 板子成功回boot -3. [15点15分] 板子成功烧录并实执行用户代码段 -4. [15点38分] 验证uart to pc的代码段 -5. [16点11分] receive data from pc代码段无法实现,但是验证了NE寄存器的运行 -6. [16点43分] 验证了串口1其他4个寄存器的中断服务函数的运行,尝试了双中断,但是失败了。对中断服务函数的运行大概有数了 -7. [17点01分] 去拿劳动合同 -8. [17点21分] 参考stm32的串口中断服务函数,对照寄存器对相关开发进行了大概设计,具体内容在RD的log里 -[ESP8266 RTOS] [09点55分] -官方教程:https://github.com/espressif/ESP8266_RTOS_SDK/tree/master/examples -完整教程:https://blog.csdn.net/xh870189248/article/details/77985541 -https://xuhong.blog.csdn.net/article/details/104736261 - -[2022年1月13日 周四] -[任务简述] [09点37分] -1. 加上HUB看看电脑能不能识别加密芯片,如果不行,则需要上报 -2. 如果能够识别和烧录,将写好的固件烧录,测试step1和step2的功能 -3. 考虑验证UART0的通讯功能的话可能需要一个USB转TTL转接器 -[反馈] [11点43分] -1. 之前给的工程缺少了回boot代码,等杨老师重新发一份工程 -2. 请教一下烧录-调试的过程 -[ESP32 RTOS] [11点45分] -1. 两份教程 - https://www.qutaojiao.com/users/2/post - https://space.bilibili.com/1338335828?spm_id_from=333.788.b_765f7570696e666f.1 - https://github.com/whitecatboard/Lua-RTOS-ESP32 - https://www.bilibili.com/video/BV1q4411e7MB?from=search&seid=17506916660033072779&spm_id_from=333.337.0.0 - 官方文档 - https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/index.html - https://www.cnblogs.com/dongxiaodong/p/12905967.html - https://blog.csdn.net/u010177891/article/details/92085166?spm=1001.2014.3001.5502 -[2022年1月12日 周三] -[任务简述] [09点57分] -1. 参考stm32的相关例程及原理,封装中断服务函数 (完成) -2. 将已经写好的程序烧录到板子上验证串口通信 (未完成) -3. [10点55分] 翻阅《 ARM Cortex M0权威指南 》 -[总结] [17点27分] -1. 开发板识别不到,无法成功烧录 -2. 完成了step1和step2代码的编写和校准,模拟数据稳定,但因上述原因无法实机检验。 - -[2022年1月11日 周二] -[任务简述] -1. 安装并配置SI4并,导入demo工程,实现相关索引 (完成) -2. 在RD桌面安装并配置git,对demo工程进行跟踪 (完成) -3. 编写UART测试用例,依次实现: (完成) - i: PC上位机与板子的通信 - ii:板子与通用MCU的通信 -4. 验证ESP32RTOS的demo烧录和运行 (未完成) -[总结] [17点58分] -1. 安装和配置了SI4和git并完成config,import了相关工程文件并完成了Analysis -2. 搞定了USB烧录问题:瘦终端无法完成USB映射,前往探测室完成烧写和调试 -3. UART代码稍稍写了点,但是不够,中断服务函数的封装过于底层,用户层面的实现并不理想 - -[2022年1月10日 周一] -[上周总结] -周二入职,周三请假上课,周四配置电脑环境,周五领到了开发板、demo和资料。大概了解了一下开发板demo的框架,对其有了粗略的印象 -[任务简述] -1. 上午开例会 -2. 攥写任务节点手册,将毕设任务按周下发,确定各个时间段内的课题和任务,确定基本的任务框架,确定大体的重要时间节点。 -3. 熟悉UART模块的调用和接口。串口的基本逻辑大体不变,查看是否能用现成的例程完成两个终端设备的通信。在USB权限下发之后,分别验证和上位机的通讯及通过ESP32与上位机的通讯。 -4. 可以先行编写ESP32和服务器的明文通讯,后续再通过串口实现安全芯片的加载。 - i:确认ESP32的开发模式,arduino、lua还是sdk - ii:准备对应开发模式的相关材料,移植相关例程。 - iii:实现简单联调,马马虎虎完成本周任务 - -[2022年1月8日 周六] 在图书馆 -昨天拿到了demo,开发难度比预想的要大不少。原因有一下几个: -1. 国民的加密芯片是自研的,代码大致是寄存器操作的硬件开发,并在此基础上进行了风格很重的api封装,且api的封装既没有注释更没有使用手册,这给预想的快速开发带来了一定难度。 -2. RD桌面和office桌面并不协同 -3. 个人对密码学的相关原理完全陌生。虽然站在我的层面,开发并不需要过多的了解相关原理,这既不必要也无可能,时间并没有给我太多的选择的机会。但由于api的封装比较原始和底层,所以一定是需要足够的底层原理来支撑对相关接口的理解。 -[任务] -1. 学习密码学相关的底层硬件原理?大概应该是这个东西? -2. 学习stm32寄存器开发的相关操作,尤其是偏址、移位和与或等相关操作。 - -[2022年1月7日 周五] -[任务简述] -1. 认识和熟悉开发环境及板子demo -2. 尝试编译和烧写demo -3. 尝试更改demo -日志存留在国民的RD桌面之中 - -[2022年1月6日 周四] -[任务简述] -1. 搭建开发环境 -2. 领取开发资料,dp开发加密芯片demo -3. 确认开发需求、任务和目标 -4. 课题计划节点确认 -[任务描述] - 确认为以下两条主线 -1. 终端侧 - 通过加载安全芯片解决:身份伪造、身份标识、身份认证三个问题(杨威老师的建议:唯一SN) - 利用芯片的真随机数模块,提供密钥的生成、存储和派发,提供数据的加密、解密和存储功能 -2. 协议侧 - 设计出一款能够保证或者能够着重保重身份合法性和数据安全性二者之一的通讯协议,并将其加载在终端和服务器的通讯中,保证通讯安全 - 目前粗略的想法是加载数字签名和DH密钥交换 - -[计划节点] -1. 明文通讯系统 [2022年1月6日--2022年1月9日] - 虽然本人更倾向于使用公司提供的通用MCU或者尝试ESP芯片的SDK开发,但在此之前需要做出一款明文通信的demo交由yjc调试。 - 故决定采用ESP32模块,利用arduino通过MQTT协议实现简易终端与网关、服务器的通信,并实现简单交互。使得在年节之前,yjc能够验证通讯链路的完整性。 - 本系统的关键点在于: - i: ESP32通过PubSubClient库和CJson库实现与本地服务器的通信 - ii:ESP32通过默认栈接收、解析和执行下行命令 -2. 终端加密 [2022年1月9日--2022年1月21日] - 本阶段抛开信道传输,在加密芯片的加载上发力。在没有拿到demo之前能做的设想不多,大致的框架如下: - i: 熟悉demo中提供的api接口 - ii:实现通用MCU与加密芯片的通讯 - iii: 实现简单数据的加密、解密、存储和提取 - iv:调用真随机数RP接口生成指定的唯一序列 - v: 根据第一版协议生成和派发密钥 -3. 协议驱动 [2022年2月7日--2022年2月18日] - 本阶段移植和编写协议的硬件驱动的接口,大致要求如下: - i: 终端能够实现数据的加密、解密、存储和提取 - ii: 终端能够实现密钥(公钥和私钥)的生成、派发和存储,并利用密钥生成和解析数字签名,从而实现文字的传输 -4. 毕设V1.0.0打样,实现毕设的初版 [2022年2月21日--2022年3月4日] - 在打样过程中,要通过简单的攻防体现身份合法性和数据可靠性,不妨设想一个简单的流程,流程大致如下: - i: 终端设备的注册,并与服务端实现密钥交换和存储 - ii: 终端从加密芯片中提取密钥并加密要上传的温湿度数据,随即将之通过网关发送到服务端 - iii: 通过信道抓包,捕获终端上传的信息。这一过程要体现在两个方面。一是注册过程中捕捉交换的密钥,二是在通讯过程中捕捉通讯消息。尝试能否用简单方式,解密过程消息或者注入诱导消息。 - iv: 服务器收到终端消息,利用密钥对证书解密,获取温湿度信息。 - 需要额外考虑的是: - i: 信道环境和干扰 - ii: 杨老师提醒的侧信道攻击、故障注入和dos攻击 -5. 毕设V2.0.0打样,基本实现毕设 [2022年3月7日--2022年3月14日] - 加入用户侧接口(web、app或者小程序) - 能够提供一个相对合法可靠的通讯系统和数据存储环境 - 额外的选择 - i: 提供一个比较全面的适配工具 - ii: 用户侧接口适配一定设备并相对完善部分UI设计 -6. 准备毕业论文 [2021年3月?日--2021年3月?日] -7. 准备答辩材料 [2021年3月?日--2021年3月?日] - PPT和材料或许应该体现一下几个特点: - i: 身份合法性和数据可靠性 - ii: 简单的信道攻击和侧信道攻击过程 - iii: 数据加密的效率和可靠性 - iv: 提供的协议的优点和缺点 - ..... -P.S. 从公司离职的时间暂不确定,若是早于答辩时间,记得在保密条件准许的前提下,提前准备好答辩要用到的数据、视频和图片。尤其安全芯片和可能会有的侧信道攻击的工具个人并无条件,需要提前在公司备齐。 - -[记事本] -ESP32的教程,包含micropython、arduino的教程 -https://mc.dfrobot.com.cn/thread-271930-1-1.html - -[小疑惑] -1. 瘦终端能否烧录和调试 -2. 要用什么样的通用MCU - -[待做事项] -1. 杨老师消失了好久,没要到demo - -[日程] -1. 同yjc和贾工开了小会,大概的讨论了一下协议尤其是注册时的方案。安全芯片的接口似乎很全,某种程度上的开发难度降低了。至少看起来驱动是不用写了 +[2022年1月16日 周日] +[任务简述] [10点15分] +1. 配置SI4的环境,将ESP8266_RTOS_SDK导入并实现关联 +2. 外设调用:GPIO、Uart,了解pwm,通过外设调用,对SDK各个模块的调用有基本认识,复习rtos +3. 连接wifi +4. 连接MQTT服务器 + +[2022年1月15日 周六] +[任务简述] [09点15分] +1. 搭建ESP8266_RTOS_SDK的开发环境 +2. 尝试8266的编译、烧录和测试 +[反馈] [22点51分] +1. 环境搭好了 + i: 下载环境:https://dl.espressif.com/dl/esp32_win32_msys2_environment_and_toolchain-20190611.zip, + ii: 下载SDK:git clone --recursive https://github.com/espressif/ESP8266_RTOS_SDK.git + iii: 下载编译工具链:https://github.com/espressif/ESP8266_RTOS_SDK 中的markdown介绍中,找到"get toolchain"项点击下载,下完之后记得用winRar,用管理员权限解压,二者缺一不可。 + iv: 下好的环境相当于打包好的虚拟机,解压之后有个"msys32"文件夹,就相当于虚拟机桌面,即"PATH",将SDK放在"\msys32\home\Magnetic"之下 + v: 将解压好的工具链"xtensa-lx106-elf"文件夹放到"\msys32\opt"文件夹下 + vi: 配置路径,打开子文件夹\etc\profile.d里面的 esp32_toolchain.sh文件,最好用notepad++这些编程编辑器打开,不用用记事本打开! + export PATH="/opt/xtensa-lx106-elf/bin:$PATH" + export IDF_PATH="/home/Magnetic/ESP8266_RTOS_SDK" + vii: 运行demo:"ESP8266_RTOS_SDK"文件夹下新建目录"MyProject",从"example"文件夹中拿出demo工程"hello_world"放入,运行终端 + ix: make指令集 + a: make menuconfig 配置,Serial记得将端口名字改为设备的串口号如COM5,flash为4M + b: make all 表示仅仅编译项目不烧录,make后面加-j启用并行编译多个文件 + c: make flash 根据我们刚刚的配置信息编译和烧录到板子 + d: make monitor 打开乐鑫提供的串口查看工具 + e: make flash monitor 要一次上传并监视输出,可以运行 + f: make erase_flash flash 擦除所有内容,然后重新刷新新应用,引导加载程序和初始化数据仓 +2. 配置Vscode + i: 在Vscode中打开文件夹"ESP8266_RTOS_SDK",ctrl+shift+p 全局设置在.json中编辑 + { + "window.zoomLevel": 1, + "editor.formatOnType": true, + "[cpp]":{ + "editor.quickSuggestions": { + "other": true, + "comments": true, + "strings": true + } + }, + "[c]":{ + "editor.quickSuggestions": { + "other": true, + "comments": true, + "strings": true + } + }, + "workbench.colorTheme": "Monokai", + "workbench.iconTheme": "vs-minimal", + //E:\Espressif\Esp32\msys32 + "terminal.integrated.shell.windows": "E:\\Espressif\\ESP32\\msys32\\msys2_shell.cmd", //改成自己的 + "terminal.integrated.shellArgs.windows": ["-defterm", "-mingw32", "-no-start", "-here"] + } + ii: 右键hello_world在终端打开,执行make指令 +3. 找不到make可能得安装cmake和mingw32并且添加到系统环境 + + + +[2022年1月14日 周五] +[任务简述] [09点45分] +1. 烧录吧,累了 +2. [14点34分] 板子成功回boot +3. [15点15分] 板子成功烧录并实执行用户代码段 +4. [15点38分] 验证uart to pc的代码段 +5. [16点11分] receive data from pc代码段无法实现,但是验证了NE寄存器的运行 +6. [16点43分] 验证了串口1其他4个寄存器的中断服务函数的运行,尝试了双中断,但是失败了。对中断服务函数的运行大概有数了 +7. [17点01分] 去拿劳动合同 +8. [17点21分] 参考stm32的串口中断服务函数,对照寄存器对相关开发进行了大概设计,具体内容在RD的log里 +[ESP8266 RTOS] [09点55分] +官方教程:https://github.com/espressif/ESP8266_RTOS_SDK/tree/master/examples +完整教程:https://blog.csdn.net/xh870189248/article/details/77985541 +https://xuhong.blog.csdn.net/article/details/104736261 + +[2022年1月13日 周四] +[任务简述] [09点37分] +1. 加上HUB看看电脑能不能识别加密芯片,如果不行,则需要上报 +2. 如果能够识别和烧录,将写好的固件烧录,测试step1和step2的功能 +3. 考虑验证UART0的通讯功能的话可能需要一个USB转TTL转接器 +[反馈] [11点43分] +1. 之前给的工程缺少了回boot代码,等杨老师重新发一份工程 +2. 请教一下烧录-调试的过程 +[ESP32 RTOS] [11点45分] +1. 两份教程 + https://www.qutaojiao.com/users/2/post + https://space.bilibili.com/1338335828?spm_id_from=333.788.b_765f7570696e666f.1 + https://github.com/whitecatboard/Lua-RTOS-ESP32 + https://www.bilibili.com/video/BV1q4411e7MB?from=search&seid=17506916660033072779&spm_id_from=333.337.0.0 + 官方文档 + https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/index.html + https://www.cnblogs.com/dongxiaodong/p/12905967.html + https://blog.csdn.net/u010177891/article/details/92085166?spm=1001.2014.3001.5502 +[2022年1月12日 周三] +[任务简述] [09点57分] +1. 参考stm32的相关例程及原理,封装中断服务函数 (完成) +2. 将已经写好的程序烧录到板子上验证串口通信 (未完成) +3. [10点55分] 翻阅《 ARM Cortex M0权威指南 》 +[总结] [17点27分] +1. 开发板识别不到,无法成功烧录 +2. 完成了step1和step2代码的编写和校准,模拟数据稳定,但因上述原因无法实机检验。 + +[2022年1月11日 周二] +[任务简述] +1. 安装并配置SI4并,导入demo工程,实现相关索引 (完成) +2. 在RD桌面安装并配置git,对demo工程进行跟踪 (完成) +3. 编写UART测试用例,依次实现: (完成) + i: PC上位机与板子的通信 + ii:板子与通用MCU的通信 +4. 验证ESP32RTOS的demo烧录和运行 (未完成) +[总结] [17点58分] +1. 安装和配置了SI4和git并完成config,import了相关工程文件并完成了Analysis +2. 搞定了USB烧录问题:瘦终端无法完成USB映射,前往探测室完成烧写和调试 +3. UART代码稍稍写了点,但是不够,中断服务函数的封装过于底层,用户层面的实现并不理想 + +[2022年1月10日 周一] +[上周总结] +周二入职,周三请假上课,周四配置电脑环境,周五领到了开发板、demo和资料。大概了解了一下开发板demo的框架,对其有了粗略的印象 +[任务简述] +1. 上午开例会 +2. 攥写任务节点手册,将毕设任务按周下发,确定各个时间段内的课题和任务,确定基本的任务框架,确定大体的重要时间节点。 +3. 熟悉UART模块的调用和接口。串口的基本逻辑大体不变,查看是否能用现成的例程完成两个终端设备的通信。在USB权限下发之后,分别验证和上位机的通讯及通过ESP32与上位机的通讯。 +4. 可以先行编写ESP32和服务器的明文通讯,后续再通过串口实现安全芯片的加载。 + i:确认ESP32的开发模式,arduino、lua还是sdk + ii:准备对应开发模式的相关材料,移植相关例程。 + iii:实现简单联调,马马虎虎完成本周任务 + +[2022年1月8日 周六] 在图书馆 +昨天拿到了demo,开发难度比预想的要大不少。原因有一下几个: +1. 国民的加密芯片是自研的,代码大致是寄存器操作的硬件开发,并在此基础上进行了风格很重的api封装,且api的封装既没有注释更没有使用手册,这给预想的快速开发带来了一定难度。 +2. RD桌面和office桌面并不协同 +3. 个人对密码学的相关原理完全陌生。虽然站在我的层面,开发并不需要过多的了解相关原理,这既不必要也无可能,时间并没有给我太多的选择的机会。但由于api的封装比较原始和底层,所以一定是需要足够的底层原理来支撑对相关接口的理解。 +[任务] +1. 学习密码学相关的底层硬件原理?大概应该是这个东西? +2. 学习stm32寄存器开发的相关操作,尤其是偏址、移位和与或等相关操作。 + +[2022年1月7日 周五] +[任务简述] +1. 认识和熟悉开发环境及板子demo +2. 尝试编译和烧写demo +3. 尝试更改demo +日志存留在国民的RD桌面之中 + +[2022年1月6日 周四] +[任务简述] +1. 搭建开发环境 +2. 领取开发资料,dp开发加密芯片demo +3. 确认开发需求、任务和目标 +4. 课题计划节点确认 +[任务描述] + 确认为以下两条主线 +1. 终端侧 + 通过加载安全芯片解决:身份伪造、身份标识、身份认证三个问题(杨威老师的建议:唯一SN) + 利用芯片的真随机数模块,提供密钥的生成、存储和派发,提供数据的加密、解密和存储功能 +2. 协议侧 + 设计出一款能够保证或者能够着重保重身份合法性和数据安全性二者之一的通讯协议,并将其加载在终端和服务器的通讯中,保证通讯安全 + 目前粗略的想法是加载数字签名和DH密钥交换 + +[计划节点] +1. 明文通讯系统 [2022年1月6日--2022年1月9日] + 虽然本人更倾向于使用公司提供的通用MCU或者尝试ESP芯片的SDK开发,但在此之前需要做出一款明文通信的demo交由yjc调试。 + 故决定采用ESP32模块,利用arduino通过MQTT协议实现简易终端与网关、服务器的通信,并实现简单交互。使得在年节之前,yjc能够验证通讯链路的完整性。 + 本系统的关键点在于: + i: ESP32通过PubSubClient库和CJson库实现与本地服务器的通信 + ii:ESP32通过默认栈接收、解析和执行下行命令 +2. 终端加密 [2022年1月9日--2022年1月21日] + 本阶段抛开信道传输,在加密芯片的加载上发力。在没有拿到demo之前能做的设想不多,大致的框架如下: + i: 熟悉demo中提供的api接口 + ii:实现通用MCU与加密芯片的通讯 + iii: 实现简单数据的加密、解密、存储和提取 + iv:调用真随机数RP接口生成指定的唯一序列 + v: 根据第一版协议生成和派发密钥 +3. 协议驱动 [2022年2月7日--2022年2月18日] + 本阶段移植和编写协议的硬件驱动的接口,大致要求如下: + i: 终端能够实现数据的加密、解密、存储和提取 + ii: 终端能够实现密钥(公钥和私钥)的生成、派发和存储,并利用密钥生成和解析数字签名,从而实现文字的传输 +4. 毕设V1.0.0打样,实现毕设的初版 [2022年2月21日--2022年3月4日] + 在打样过程中,要通过简单的攻防体现身份合法性和数据可靠性,不妨设想一个简单的流程,流程大致如下: + i: 终端设备的注册,并与服务端实现密钥交换和存储 + ii: 终端从加密芯片中提取密钥并加密要上传的温湿度数据,随即将之通过网关发送到服务端 + iii: 通过信道抓包,捕获终端上传的信息。这一过程要体现在两个方面。一是注册过程中捕捉交换的密钥,二是在通讯过程中捕捉通讯消息。尝试能否用简单方式,解密过程消息或者注入诱导消息。 + iv: 服务器收到终端消息,利用密钥对证书解密,获取温湿度信息。 + 需要额外考虑的是: + i: 信道环境和干扰 + ii: 杨老师提醒的侧信道攻击、故障注入和dos攻击 +5. 毕设V2.0.0打样,基本实现毕设 [2022年3月7日--2022年3月14日] + 加入用户侧接口(web、app或者小程序) + 能够提供一个相对合法可靠的通讯系统和数据存储环境 + 额外的选择 + i: 提供一个比较全面的适配工具 + ii: 用户侧接口适配一定设备并相对完善部分UI设计 +6. 准备毕业论文 [2021年3月?日--2021年3月?日] +7. 准备答辩材料 [2021年3月?日--2021年3月?日] + PPT和材料或许应该体现一下几个特点: + i: 身份合法性和数据可靠性 + ii: 简单的信道攻击和侧信道攻击过程 + iii: 数据加密的效率和可靠性 + iv: 提供的协议的优点和缺点 + ..... +P.S. 从公司离职的时间暂不确定,若是早于答辩时间,记得在保密条件准许的前提下,提前准备好答辩要用到的数据、视频和图片。尤其安全芯片和可能会有的侧信道攻击的工具个人并无条件,需要提前在公司备齐。 + +[记事本] +ESP32的教程,包含micropython、arduino的教程 +https://mc.dfrobot.com.cn/thread-271930-1-1.html + +[小疑惑] +1. 瘦终端能否烧录和调试 +2. 要用什么样的通用MCU + +[待做事项] +1. 杨老师消失了好久,没要到demo + +[日程] +1. 同yjc和贾工开了小会,大概的讨论了一下协议尤其是注册时的方案。安全芯片的接口似乎很全,某种程度上的开发难度降低了。至少看起来驱动是不用写了 diff --git "a/\345\274\200\345\217\221\346\211\213\345\206\214/\345\274\200\345\217\221\346\211\213\345\206\214\345\217\212\347\226\221\351\227\256\351\233\206\345\220\210.md" "b/\345\274\200\345\217\221\346\211\213\345\206\214/\345\274\200\345\217\221\346\211\213\345\206\214\345\217\212\347\226\221\351\227\256\351\233\206\345\220\210.md" index 3cc40ee60288ff26e3399a57b4c858a390c6a259..25e9ce13568d315a0c0cbef755d371a938a0398e 100644 --- "a/\345\274\200\345\217\221\346\211\213\345\206\214/\345\274\200\345\217\221\346\211\213\345\206\214\345\217\212\347\226\221\351\227\256\351\233\206\345\220\210.md" +++ "b/\345\274\200\345\217\221\346\211\213\345\206\214/\345\274\200\345\217\221\346\211\213\345\206\214\345\217\212\347\226\221\351\227\256\351\233\206\345\220\210.md" @@ -1,99 +1,99 @@ -# 开发前准备 -## 1. 设备需要与服务器交换的字段 -a. SN码————设备的唯一标识 - -b. 设备的类型 - - I. 传感器型 - II. 门禁型 - III. 智能互联设备 - -c. DH密钥交换——得到通信的对称密钥 - -d. 用于双方数字签名的公钥 - - - -## 2. 注册过程 - -1. 设备主动向服务器发起注册请求 -2. 设备生成公私钥对,并将公钥发送给服务器(一次发送) -3. 服务器收到注册信息后,也生成公私钥对,并将公钥发送给设备(二次发送) -4. 设备收到服务器发送的公钥后,此时双方利用对方的公钥以及自身的私钥结合,生成相同的对称密钥 -5. 设备利用得到的对称密钥发送测试数据给服务器(三次发送) -6. 服务器验签,确认对称密钥可以解密并且双方公钥没有被篡改,注册成功,发送验证成功回调给设备(四次发送) -7. 设备将服务器发送的公钥,以及自己的私钥,以及得到的对称密钥存放起来。 -8. 服务器将设备发送的公钥,以及自己的私钥,以及得到的对称密钥存放起来。 - - -## 3. 通信过程 - -1. 组成消息体的基本结构 -```json -{ - "topic": "temperture", - "payload": "35.8", - "timestamp": 1641611982391, - "SNNo": "device001" -} -``` - -| 字段名 | 类型 | 注释 | -| --- | --- | --- | -| topic | str | 上传消息的主题 | -| payload | str | 消息内容主体 | -| timestamp | int | 时间戳(秒级别的) | -| SNNo | str | 设备唯一标识SN码 | - -2. 利用对称密钥对消息体进行加密 -3. 加密后的消息内容取哈希后利用私钥加密,结合加密后的消息内容一并发送 -```json -{ - "plain": "加密后的内容", - "sign": "签名后的内容" -} -``` -4. 接收方取得消息后验签,确认消息合法性后,在执行后续操作 - -5. PS: 发送消息时,MQTT主题需带上自己的设备号信息,以供接收方确 -认发送方身份 - - 如设备device001发送信息,则发布主题应为 /device001/message - - -网关端脚本会识别数据格式对不对,如果不对的话也就在这里就拦截了,而且不会再转发到服务器上,并且会发送一个主题为/{deviceId}/error 的错误信息给设备 - -所以设备要主动订阅/{deviceId}/callback/# 的消息内容 - -设想: - 这里是不是可以定制一个callback主题,让网关处理完消息之后及时发送回调给设备,这样设备也知道自己的消息到底发没发成功,如果没法成功的话在哪里出现了问题,提高交互体验。 -问题1: - 假设中间人在这里做了手脚,发送了这样的主题给设备,让设备误以为消息已经到达了服务器,实际上被拦截下来了,是不是存在着安全的问题。 - -## 主题格式规范 - -设备端上发的主题必须遵循一下规定 -1. 第一个字段必须是自身的deviceId 如 /{deviceId}/ -2. 第二个字段是收发的字段名 - -| 字段 | 解释 | 是否需要设备主动订阅 | -| --- | --- | :---: | -| message | 正常交互信息,载体参考3. 通信过程 | 否 | -| callback | 交互返回信息 | 是 | -| system | 系统返回信息(包括第一次注册时,都是用这个主题) | 是 | - -## 错误码映射表 -回调返回格式 -```json -{ - "code": 200, - "msg": "success" -} -``` - -| code | 解释 | 备注 | -| --- | :---: | --- | -| 200 | 成功 | | -| 300 | 传送数据结构不对,或者缺少某个字段 | | -| 400 | 传输到服务器时失败 | 有可能原因时服务器断开连接等问题,msg有具体报错信息 | -| 500 | 时间戳非法 | 时间戳已超时或者时间戳大于当前时间 | +# 开发前准备 +## 1. 设备需要与服务器交换的字段 +a. SN码————设备的唯一标识 + +b. 设备的类型 + + I. 传感器型 + II. 门禁型 + III. 智能互联设备 + +c. DH密钥交换——得到通信的对称密钥 + +d. 用于双方数字签名的公钥 + + + +## 2. 注册过程 + +1. 设备主动向服务器发起注册请求 +2. 设备生成公私钥对,并将公钥发送给服务器(一次发送) +3. 服务器收到注册信息后,也生成公私钥对,并将公钥发送给设备(二次发送) +4. 设备收到服务器发送的公钥后,此时双方利用对方的公钥以及自身的私钥结合,生成相同的对称密钥 +5. 设备利用得到的对称密钥发送测试数据给服务器(三次发送) +6. 服务器验签,确认对称密钥可以解密并且双方公钥没有被篡改,注册成功,发送验证成功回调给设备(四次发送) +7. 设备将服务器发送的公钥,以及自己的私钥,以及得到的对称密钥存放起来。 +8. 服务器将设备发送的公钥,以及自己的私钥,以及得到的对称密钥存放起来。 + + +## 3. 通信过程 + +1. 组成消息体的基本结构 +```json +{ + "topic": "temperture", + "payload": "35.8", + "timestamp": 1641611982391, + "SNNo": "device001" +} +``` + +| 字段名 | 类型 | 注释 | +| --- | --- | --- | +| topic | str | 上传消息的主题 | +| payload | str | 消息内容主体 | +| timestamp | int | 时间戳(秒级别的) | +| SNNo | str | 设备唯一标识SN码 | + +2. 利用对称密钥对消息体进行加密 +3. 加密后的消息内容取哈希后利用私钥加密,结合加密后的消息内容一并发送 +```json +{ + "plain": "加密后的内容", + "sign": "签名后的内容" +} +``` +4. 接收方取得消息后验签,确认消息合法性后,在执行后续操作 + +5. PS: 发送消息时,MQTT主题需带上自己的设备号信息,以供接收方确 +认发送方身份 + + 如设备device001发送信息,则发布主题应为 /device001/message + + +网关端脚本会识别数据格式对不对,如果不对的话也就在这里就拦截了,而且不会再转发到服务器上,并且会发送一个主题为/{deviceId}/error 的错误信息给设备 + +所以设备要主动订阅/{deviceId}/callback/# 的消息内容 + +设想: + 这里是不是可以定制一个callback主题,让网关处理完消息之后及时发送回调给设备,这样设备也知道自己的消息到底发没发成功,如果没法成功的话在哪里出现了问题,提高交互体验。 +问题1: + 假设中间人在这里做了手脚,发送了这样的主题给设备,让设备误以为消息已经到达了服务器,实际上被拦截下来了,是不是存在着安全的问题。 + +## 主题格式规范 + +设备端上发的主题必须遵循一下规定 +1. 第一个字段必须是自身的deviceId 如 /{deviceId}/ +2. 第二个字段是收发的字段名 + +| 字段 | 解释 | 是否需要设备主动订阅 | +| --- | --- | :---: | +| message | 正常交互信息,载体参考3. 通信过程 | 否 | +| callback | 交互返回信息 | 是 | +| system | 系统返回信息(包括第一次注册时,都是用这个主题) | 是 | + +## 错误码映射表 +回调返回格式 +```json +{ + "code": 200, + "msg": "success" +} +``` + +| code | 解释 | 备注 | +| --- | :---: | --- | +| 200 | 成功 | | +| 300 | 传送数据结构不对,或者缺少某个字段 | | +| 400 | 传输到服务器时失败 | 有可能原因时服务器断开连接等问题,msg有具体报错信息 | +| 500 | 时间戳非法 | 时间戳已超时或者时间戳大于当前时间 | diff --git "a/\346\240\221\350\216\223\346\264\276\344\270\255\350\275\254\350\204\232\346\234\254/index.py" "b/\346\240\221\350\216\223\346\264\276\344\270\255\350\275\254\350\204\232\346\234\254/index.py" index 64a812c1fddda069f28c5ffbb487661e93a0b9d8..31851a342580bf5b17578a1e950064108fcb90ed 100644 --- "a/\346\240\221\350\216\223\346\264\276\344\270\255\350\275\254\350\204\232\346\234\254/index.py" +++ "b/\346\240\221\350\216\223\346\264\276\344\270\255\350\275\254\350\204\232\346\234\254/index.py" @@ -1,68 +1,68 @@ -import time -import paho.mqtt.client as mqtt -import json,requests - -HOST = '192.168.238.131' -# HOST = '192.168.31.240' # IoT 树莓派的地址 -PORT = 1883 - -def on_connect(client, userdata, flags, rc): - if rc == 0: - print('连接成功') - print('Connected with result code ' + str(rc)) - -def on_message(client, userdata, msg): - message = msg.payload.decode("utf-8") - print(msg.topic + "\n" + message) - topic_split = msg.topic.split("/") - deviceId = topic_split[1] - message_type = topic_split[2] - if message_type == "message": # 判断消息不是回调否则进入死循环 - validate_result = validate_message(message, deviceId) - print(validate_result) - if validate_result == True: - message_handle(message, deviceId) - elif message_type == "clock": - return_callback(200, int(time.time()), deviceId) - -def validate_message(msg, deviceId): - keys = ['topic', 'payload', 'timestamp', 'SNNo'] - try: - json_data = json.loads(msg) - for key in keys: - json_data[key] - except Exception: - return_callback(300, "data format error!", deviceId) - return False - return True - -def message_handle(msg, deviceId): - try: - headers = { - 'Content-Type': 'application/json' - } - callback = requests.post('http://localhost:8000/recieveMessage',data=msg,headers=headers).content.decode() - if callback == '"success"': - return_callback(200, "success", deviceId) - else: - return_callback(500, callback, deviceId) - except Exception as e: - print(str(e)) - return_callback(400, str(e), deviceId) - -# 回调统一处理函数 -def return_callback(code, msg, deviceId): - body = { - "code": code, - "msg": msg - } - body = json.dumps(body) - client.publish("/" + deviceId + "/callback", body, qos=0, retain=False) - -client = mqtt.Client(client_id="server_script", protocol=3) -client.on_connect = on_connect -client.on_message = on_message -client.connect(host=HOST, port=PORT, keepalive=60) -time.sleep(1) -client.subscribe('#') +import time +import paho.mqtt.client as mqtt +import json,requests + +HOST = '192.168.238.131' +# HOST = '192.168.31.240' # IoT 树莓派的地址 +PORT = 1883 + +def on_connect(client, userdata, flags, rc): + if rc == 0: + print('连接成功') + print('Connected with result code ' + str(rc)) + +def on_message(client, userdata, msg): + message = msg.payload.decode("utf-8") + print(msg.topic + "\n" + message) + topic_split = msg.topic.split("/") + deviceId = topic_split[1] + message_type = topic_split[2] + if message_type == "message": # 判断消息不是回调否则进入死循环 + validate_result = validate_message(message, deviceId) + print(validate_result) + if validate_result == True: + message_handle(message, deviceId) + elif message_type == "clock": + return_callback(200, int(time.time()), deviceId) + +def validate_message(msg, deviceId): + keys = ['topic', 'payload', 'timestamp', 'SNNo'] + try: + json_data = json.loads(msg) + for key in keys: + json_data[key] + except Exception: + return_callback(300, "data format error!", deviceId) + return False + return True + +def message_handle(msg, deviceId): + try: + headers = { + 'Content-Type': 'application/json' + } + callback = requests.post('http://localhost:8000/recieveMessage',data=msg,headers=headers).content.decode() + if callback == '"success"': + return_callback(200, "success", deviceId) + else: + return_callback(500, callback, deviceId) + except Exception as e: + print(str(e)) + return_callback(400, str(e), deviceId) + +# 回调统一处理函数 +def return_callback(code, msg, deviceId): + body = { + "code": code, + "msg": msg + } + body = json.dumps(body) + client.publish("/" + deviceId + "/callback", body, qos=0, retain=False) + +client = mqtt.Client(client_id="server_script", protocol=3) +client.on_connect = on_connect +client.on_message = on_message +client.connect(host=HOST, port=PORT, keepalive=60) +time.sleep(1) +client.subscribe('#') client.loop_forever() \ No newline at end of file