[英]Validate out of process COM Server client is trusted
我有一個進程外的COM Server,它公開了我不希望被不信任的代碼調用的方法。
基本上,我想做的是防止聰明的客戶調用這些我也需要訪問的方法。 我認為應該一起考慮另一種解決方案。 但出於某種原因,我寧願不參加,但我實際上沒有那種選擇。 我可以采用一個不太健壯的解決方案,但希望盡可能地健壯。
我有能力更改客戶端和服務器代碼。 服務器用C ++編寫,客戶端用C#編寫。
確保這些呼叫的最佳方法是什么?
我認為,這種問題在進程間通信或遠程過程調用中並不少見。 因此,我希望有一個可接受的行業最佳實踐,或者甚至是一個直接的COM解決方案。 在沒有這種情況的情況下,我傾向於從參數中獲取下划線數據,並使用該數據段作為字符串使用另一數據段的密鑰進行加密,然后將其傳遞給服務器進行驗證。
如果有現成的COM解決方案或最佳實踐,我什么也沒找到。 我發現的一種常見技術是使用哈希鍵。 客戶端生成密鑰並將其傳遞給服務器。 服務器生成相同的密鑰,如果與客戶端的密鑰不匹配,則呼叫被拒絕。
我將哈希密鑰基於某個秘密,該秘密是從API所作用的基礎數據中提取的。 由於每次使用我的數據都不同,因此密鑰每次都不同。 雙方都可以在調用之前訪問基礎數據,以便他們可以生成相同的密鑰。 我選擇對base64進行編碼,只是因為我更喜歡將NULL終止字符數組而不是字節數組傳遞給服務器。
LPCSTR lpszSomeSecret = "Some Secret To Be Hashed" ;
std::string strEncodedHash ; // the resulting hash.
HCRYPTPROV hProv = NULL ;
HCRYPTHASH hHash = NULL ;
DWORD cbSomeSecret = (DWORD)::strlen(lpszSomeSecret) ;
BYTE* pbHash = NULL ;
DWORD cbHash = 0 ;
DWORD cbHashSize = (DWORD)sizeof(cbHash) ;
LPSTR pchEncodedHash = NULL ;
int cbEncodedHash = 0 ;
HRESULT hResult = S_OK ;
if (!::CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {
hResult = ::AtlHresultFromLastError() ;
} else if (!::CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
hResult = ::AtlHresultFromLastError() ;
} else if (!::CryptHashData(hHash, (BYTE*)lpszSomeSecret, cbSomeSecret, 0)) {
hResult = ::AtlHresultFromLastError() ;
} else if (!::CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&cbHash, &cbHashSize, 0)) {
hResult = ::AtlHresultFromLastError() ;
} else if ((pbHash = (BYTE*)::malloc(cbHash)) == NULL) {
hResult = E_OUTOFMEMORY ;
} else if (!::CryptGetHashParam(hHash, HP_HASHVAL, pbHash, &cbHash, 0)) {
hResult = ::AtlHresultFromLastError() ;
} else if ((pchEncodedHash = (LPSTR)::malloc(
(cbEncodedHash = ::Base64EncodeGetRequiredLength(cbHash, ATL_BASE64_FLAG_NOPAD | ATL_BASE64_FLAG_NOCRLF))
)) == NULL) {
hResult = E_OUTOFMEMORY ;
} else if (!::Base64Encode(pbHash, cbHash, pchEncodedHash, &cbEncodedHash, ATL_BASE64_FLAG_NOPAD | ATL_BASE64_FLAG_NOCRLF)) {
hResult = E_FAIL ;
} else {
strEncodedHash.assign(pchEncodedHash, cbEncodedHash) ;
}
if (pchEncodedHash) ::free(pchEncodedHash) ;
if (pbHash) ::free(pbHash) ;
if (hProv) ::CryptReleaseContext(hProv, 0) ;
if (hHash) ::CryptDestroyHash(hHash) ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.