1

我正在設計一個使用PKCS#11加密API監視硬件安全模塊密碼操作的第三方實現的C應用程序。明文密碼保護

PKCS#11標準規定(除其他之外)對庫可能負責的密碼對象(密鑰,證書等)的基本訪問控制。

要訪問一個私有對象,我的應用程序打開一個PKCS#11會話(C_OpenSession),然後用登錄名和密碼(UTF8字符串)調用PKCS#11 C_Login函數。 然後他們都被硬件設備檢查。 如果(登錄名,密碼)對是有效的,會話將更新爲「已認證」,並且我的應用程序可以訪問私有對象。

注意私有對象由harware設備主持和「訪問私有對象」是指「能夠在硬件設備中使用它們」(祕密和私鑰永不導出我的應用程序的虛擬地址空間,並且每個密碼操作都由硬件設備執行)。

因此,密碼材料存儲似乎被正確解決;然而,我的申請必須提供密碼C_Login功能

注意我的應用程序的加密部分不會由用戶啓動;此處不能使用密碼輸入或基於智能卡的身份驗證/密碼解密。 密碼混淆(或純文本存儲...)也不是一個選項。

我可能是錯的(我希望如此),但我認爲沒有最終的解決方案,以防止密碼泄露(任何調試器捕捉C_Login通話將很容易地從正確的CPU寄存器取回密碼 - 或存儲器位置它可能指向)。

所以我不是在尋找一種方式來防止這種一種泄漏(當然,如果有人有一個解決這個問題 - 這是一個非常普遍的一個,我認爲(防止由CPU引起的泄漏處理敏感數據) - ,我很樂意閱讀它!)。

我的目的是提供一個合理的安全水平(即使密碼的明文版本將在我的應用程序的地址空間活着,將在移動(或引用)一個CPU寄存器)。

現在,在我的測試環境中,密碼是硬編碼的(作爲提供給C_Login函數的純文本參數)。 由於具有高效的實時調試預防是一個棘手的問題(我只有一雙手,一些咖啡和GNU編譯器),我猜«原因»是有關防止:

  1. 密碼通過靜態分析偷竊,
  2. 從明文存儲器複製密碼。

因此,我正在考慮使用基於軟件的加密在磁盤上存儲密碼。 我的應用程序可以訪問由專用用戶帳戶擁有的本地加密密鑰。 此密鑰將用於加密/解密包含密碼的文件(使用軟件加密API)。

注意關鍵就在一個密鑰存儲(Java密鑰存儲,MSCPI/CNG密鑰存儲提供程序等)

它並不能防止密碼被泄露主辦CPU,但至少需要用戶通過操作系統的認證。 然後,我的代碼的任何(靜態)反向工程不會泄漏密碼,只有授權用戶才能解密它。

當然,這只是關於報告OS用戶管理和身份驗證能力的問題。 但是我對這件事很無奈,我想不出其他什麼。

也許有人對途徑的想法,以防止密碼泄露(彙編代碼靜態分析,未授權的訪問主機)時,它必須作爲明文參數的函數編程方式提供?

回答

0

也許一些whitebox-crypto產品可以安排你的二進制文件,這樣PKCS#11設備的PIN碼永遠不會在內存中的一個位置,因此調試器很容易訪問。