zoukankan      html  css  js  c++  java
  • 【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,做以上总结,给同为程序猿的我们,留下些许的足迹。

      一个普通程序员的成长路程,欢迎关注我的公众号,茫茫人海,能与你相遇既是有缘。哈哈

                

  • 相关阅读:
    ruby 实现java中的aes 加密解密
    移动端手机端web页面中背景图固定问题
    hooks 组件对应的生命周期
    React 生命周期函数总结
    Sequelize 常用增删改查函数
    如何验证SSH的连通性
    如何生成SSH密钥
    如何查看本机ssh秘钥
    如何更改本地代码仓库指向
    如何发布npm 包
  • 原文地址:https://www.cnblogs.com/szhb-5251/p/11518521.html
Copyright © 2011-2022 走看看