簡體   English   中英

驗證進程外COM Server客戶端是否受信任

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM