【UEFI】---BIOS中UserPassword的重複校驗總結

  UEFI做爲目前較爲流行的一套X86架構初始化的標準框架,已受到業界內的普遍承認。而其中不少編程所採用的思想確實值得學習。今天總結下UEFI的框架下修改代碼的一點小經驗,僅供菜鳥參考。
先列乾貨,具體的小結後續補充:
  1. 明確你要的某個功能的實現邏輯,都須要在哪一個位置添加代碼。
     (很重要,這決定着你的方案是否可行重要前提,一旦此步驟錯誤,後續的代碼實現也會因爲代碼框架的不合適而徹底崩塌)
  2. 代碼須要良好的封裝性,高內聚性,低耦合性。秉着此原則。筆者建議寫代碼時從最終功能開始寫起,用到什麼變量,GUID,或者頭文件定義,就去添加什麼。這樣能保證你添加的都是你須要的,且思路不會亂。
  3. UEFI框架下常常會涉及到一些GUID,包括跨Pkg的Lib調用,在此也會小結一下。

  OK, 乾貨就這幾點,用筆者目前遇到的一個小問題--"BIOS Setup下UserPassWord重複設置密碼能夠成功的功能"爲例進行說明。html

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的重複驗證,代碼以下:   spa

            

 

 

   3.3 最終將SetVariable的函數添加至BIOS保存退出時,設置密碼的位置便可。

           

 

小結梳理:

  最終將SetVariable的函數添加至BIOS保存退出時,設置密碼的位置便可。
  此Bug梳理以後其實挺簡單的,回想本身的解問題思路,應該注意的幾個點主要以下:
    a. 理清處原有的AdminPassword的檢驗機制,學習其的一些處理方法
    b. 編碼時,對GUID和一些Lib庫的調用有點不夠清晰,也是經過本次整理從新梳理了下GUID的用法和Lib庫的調用。(後續着重總結)
    c. 有一些過程功能函數,僅限在某個.c文件內部使用,這種狀況下,果斷考慮重寫一套函數供本身使用。不要爲了外部調用原有函數而花費過多無用的時間。
    d. 最最重要的一點,寫代碼時必定要明確需求,本身要寫什麼,在哪一個地方寫?而後從最根本的需求處入手,須要什麼就添加什麼,這樣才能穩住陣腳,從容應對。

  針對這次解決的一些小Bug,作以上總結,給同爲程序猿的咱們,留下些許的足跡。

 

  一個普通程序員的成長路程,歡迎關注個人公衆號,茫茫人海,能與你相遇既是有緣。哈哈

            

 

原文出處:https://www.cnblogs.com/szhb-5251/p/11518521.html

相關文章
相關標籤/搜索