1. 程式人生 > >【UEFI】---BIOS中UserPassword的重複校驗總結

【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,做以上總結,給同為程式猿的我們,留下些許的足跡。

 

  一個普通程式設計師的成長路程,歡迎關注我的公眾號,茫茫人海,能與你相遇既是有緣。哈哈

            

&n