【UEFI】---BIOS中UserPassword的重复校验总结
UEFI作为目前较为流行的一套X86架构初始化的标准框架,已受到业界内的广泛认可。而其中很多编程所采用的思想确实值得学习。今天总结下UEFI的框架下修改代码的一点小经验,仅供菜鸟参考。
先列干货,具体的小结后续补充:
1. 明确你要的某个功能的实现逻辑,都需要在哪个位置添加代码。
(很重要,这决定着你的方案是否可行重要前提,一旦此步骤错误,后续的代码实现也会由于代码框架的不合适而完全崩塌)
2. 代码需要良好的封装性,高内聚性,低耦合性。秉着此原则。笔者建议写代码时从最终功能开始写起,用到什么变量,GUID,或者头文件定义,就去添加什么。这样能保证你添加的都是你需要的,且思路不会乱。
3. UEFI框架下经常会涉及到一些GUID,包括跨Pkg的Lib调用,在此也会小结一下。
OK, 干货就这几点,用笔者目前遇到的一个小问题--"BIOS Setup下UserPassWord重复设置密码可以成功的功能"为例进行说明。
1. 流程梳理
a. 密码的存储和校验一般多采用HASH值校验的方式,优点【安全,简单】
b. BIOS下的密码流程:

- 用户输入密码后,BIOS能拿到用户输入的字符串,首先需要对密码的复杂度进行验证。看复杂度是否符合。

- 其次是将当前输入密码与之前的存储过的密码进行对比,若有重复则放弃。密码的存储的和对比一般是使用该字符串的Hash值,非明文存储简单安全。若符合要求,则进一步将密码进行存储
(CRB代码中提供了对AdminPassword的过往三次密码重复校验,其实现的流程比较复杂一些,但是其原理应该是通过对过去三次设置的密码进行Hash值存储校验,且需要按照顺序存储,毕竟只能存储过去的三次。这个地方应该使用了类似队列的方案,先进先出)

- 最后就是在每次存储密码的时候,要把最终保存的Admin的密码的Hash存储到队列里面。原始最早存储的那个密码进行删除,将其后的两个密码Hash按顺序提升一位,然后将最新保存的密码放置在Hash队列中的第三位即可
2. 方案设计
2.1 在最终保存密码的时候,设置一个Variable存储当前UserPassword的Hash
2.2 在输入UserPassword后,读取上一次设置的密码Hash,与当前输入的密码Hash进行对比。判断是否可以被写入
3. 编码实现
3.1 设置保存UserPassword的Hash值,我们仅需要拿到当前输入密码的字符串,然后得到Sha256编值,再通过gRT->SetVariable的服务存储保存即可。初步编写的函数如下:

3.2 用户输入密码后,在做完复杂度校验后,添加UserPassWord的重复验证,代码如下:

3.3 最终将SetVariable的函数添加至BIOS保存退出时,设置密码的位置即可。

小结梳理:
最终将SetVariable的函数添加至BIOS保存退出时,设置密码的位置即可。
此Bug梳理之后其实挺简单的,回想自己的解问题思路,应该注意的几个点主要如下:
a. 理清处原有的AdminPassword的检验机制,学习其的一些处理方法
b. 编码时,对GUID和一些Lib库的调用有点不够清晰,也是通过本次整理重新梳理了下GUID的用法和Lib库的调用。(后续着重总结)
c. 有一些过程功能函数,仅限在某个.c文件内部使用,这种情况下,果断考虑重写一套函数供自己使用。不要为了外部调用原有函数而花费过多无用的时间。
d. 最最重要的一点,写代码时一定要明确需求,自己要写什么,在哪个地方写?然后从最根本的需求处入手,需要什么就添加什么,这样才能稳住阵脚,从容应对。
针对此次解决的一些小Bug,做以上总结,给同为程序猿的我们,留下些许的足迹。
【UEFI】---BIOS中UserPassword的重复校验总结的更多相关文章
- GPT vs MBR 分区 ,,, Legacy BIOS vs UEFI BIOS
MBR与GPT两种磁盘分区格式的区别 http://itoedr.blog.163.com/blog/static/120284297201378114053240 GPT Partition Tab ...
- 惠普台式机在UEFI BIOS设置通电自动开机 影响电脑自动重启关不了机设置
设置通电自动开机 影响电脑自动重启关不了机设置 惠普台式机在UEFI BIOS中 1. 开机时不断点击F10键进入BIOS,选择Advanced(高级)然后选择Boot Options,点击回车 ...
- BIOS中的UEFI和Legacy启动模式
BIOS即Basic Input/Output System,翻成中文是"基本输入/输出系统",是一种所谓的"固件",负责在开机时做硬件启动和检测等工作,并且担 ...
- 【UEFI】---BIOS中对Guid的使用以及Lib函数的使用总结
---恢复内容开始--- BIOS发展至今传统的汇编实现早已被抛弃,UEFI作为目前一套主流的标准定义接口,被广泛使用.之前被一些有关GUID和一些Lib函数的使用以及跨Pkg调用给折腾的不行,每次改 ...
- bios中只有windows boot manager下用U盘启动
在重装系统的时候,很多时候都是先进入bios设置成U盘启动项,然后进行安装,如果年代久远一点的,就设置成光驱启动,再进行:随着时间的推行,光驱已经开始淘汰了,也怀念以前的光驱装机的时光!-:) 开始进 ...
- UEFI BIOS模式下Windows系统启动过程以及引导文件修复方法
有关UEFI BIOS基础知识的简介,一年前在网易博客做过详细的概述.鉴于某些网友仍然对UEFI下Windows的启动过程不甚了解,虽然网上有各式各样的启动修复工具,但是对于新手来说,如果不明白其中的 ...
- 对“传统BIOS”与“EFI/UEFI BIOS”的基本认识
硬盘(MBR磁盘)分区基本认识+Windows启动原理 大家常会看到硬盘分区中这样的几种说法:系统分区.启动分区.活动分区.主分区.拓展分区.逻辑分区,MBR.PBR.DPT.主引导扇区等.尤其是看到 ...
- UEFI BIOS Rootkit Analysis
catalog . BIOS简介 . UEFI BIOS . EFI编程简介 . UEFI Rootkit 1. BIOS简介 BIOS("Basic Input Output System ...
- EFI/UEFI BIOS启动
全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区结构.它是可扩展固件接口标准的一部分,用来替代BIOS中的主开机纪录分区表.但因为MBR分区表不支持容量 ...
随机推荐
- Spark 系列(十一)—— Spark SQL 聚合函数 Aggregations
一.简单聚合 1.1 数据准备 // 需要导入 spark sql 内置的函数包 import org.apache.spark.sql.functions._ val spark = SparkSe ...
- JQGrid之文件上传
文件/图片上传功能,简单总结如下 1.引入ajaxfileupload.js 注意:该文件需要在引入Jquery之后引入 下载链接:https://i.cnblogs.com/Files.aspx 2 ...
- 洛谷 P1196 [NOI2002]银河英雄传说
题意简述 有30000列,每列都有一艘战舰,编号1~30000 有2种操作: 1.将一列的战舰运到另一列 2.询问两个战舰是否在同一列,如果是,求出它们之间的距离 题解思路 并查集, 维护每个点x离自 ...
- 洛谷 P3628 [APIO2010]特别行动队
题意简述 将n个士兵分为若干组,每组连续,编号为i的士兵战斗力为xi 若i~j士兵为一组,该组初始战斗力为\( s = \sum\limits_{k = i}^{j}xk \),实际战斗力\(a * ...
- Spark安装与部署
1.首先安装scala(找到合适版本的具体地址下载) 在/usr/local/目录下 wget https://www.scala-lang.org/download/**** 2.安装spark ( ...
- AutoCAD二次开发(.Net)之获取LSP变量的值
//https://blog.csdn.net/qq_21489689/article/details/78973787 [System.Security.SuppressUnmanagedCodeS ...
- 关于在taro使用wx.parse那些事
好久不见,好久没更新博客,最近工作也比较忙,今天在使用解决富文本的时候遇到两个bug,由于第一次使用wx.parse经验不足,走了很多弯路,今天特地把自己修复bug的感想分享一下,希望能帮助更多的小伙 ...
- SparkSQL Adaptive Execution
转自 https://mp.weixin.qq.com/s/Oq9L3Cmc-8G9oL8dvZ5OHQ 1 背景 本文介绍的 Adaptive Execution 将可以根据执行过程中的中间数据优化 ...
- 前端传递给后端复杂类型 webapi 等
来自URL:https://www.cnblogs.com/kylewell/p/5674564.html 前端我需要通过ajax 传递如下的一个json对象: var model = { Param ...
- $('div','li') 和 $('div , li') 和 $('div li') 区别
$('div','li')是$(子,父),是从父节点里找子,而不是找li外面的div $('div , li')才是找所有的div和li,之间不存在父子关系 $('div li') 是找div里面所有 ...