【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