(注:IMO的問題主要是關於WinAPI的和DACL,而不是關於CNG,所以請繼續閱讀!)映射
我目前正試圖修改的樣品CNG密鑰微軟的加密提供程序開發工具包的存儲提供商以這種方式,它不會而不是將密鑰存儲在單個文件中。但是,我遇到了可以分配給私鑰的安全描述符。
在Windows Server Management Console的證書管理單元中,可以管理證書的私鑰,即密鑰的所有者,DACL和SACL可以更改,從而導致NCryptSetProperty調用的安全描述符爲參數。對於DACL,管理單元僅允許/拒絕「完全控制」或「讀取」,這會導致GENERIC_ALL或GENERIC_READ位置於ACE的訪問掩碼中。
據我所知,這些通用位需要映射到特定於應用程序的權限 - 否則AccessCheck將無法工作。但是我真的需要手工做這個嗎?
CreatePrivateObjectSecurity + SetPrivateObjectSecurity並不總是有效,因爲CreatePrivateObjectSecurity對輸入安全描述符中的所有者和組非常挑剔。而且,當應用映射時,通用位在訪問掩碼中被清除,導致管理單元顯示錯誤的設置(正如我所說的,管理單元在顯示當前權限時僅考慮GA和GR位)。
看來我錯過了一些作品在這裏...
正如我上面寫的:我不把所接收的安全描述符文件或任何其他內核對象,但需要在內部存儲它。實際上,我嘗試將所有關鍵數據(公鑰和私鑰以及屬性!)存儲在數據庫中。因此,只有* PrivateObjectSecurity函數是可能的 - 但不起作用(s.a.)。 – dannyM
僅將GENERIC權限映射到特定權限**也是不正確的,因爲當CPGetProvParam/NCryptGetPropertyFn應該返回SD時,我需要再次將其轉換回來。原因是Windows Server Management Console **只識別GENERIC權限。似乎這裏有一些缺失的功能... – dannyM
@dannyM - 對不起,我錯了 - 編輯自我答案。 CP確實需要在'CPGetProvParam'中轉換爲通用掩碼 - 我在編輯的答案中描述了這一點 – RbMm