Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Uwierzytelnianie komunikatów to proces, który umożliwia aplikacjom i dostawcom usług sprawdzenie, czy przekazane między nimi dane nie zostały naruszone. Program Windows Media Device Manager umożliwia aplikacjom i dostawcom usług przeprowadzanie uwierzytelniania komunikatów przy użyciu kodów uwierzytelniania komunikatów (MACs). Oto jak działa uwierzytelnianie mac:
Nadawca danych, zazwyczaj dostawca usług, przekazuje jeden lub więcej elementów danych za pośrednictwem jednokierunkowej funkcji kryptograficznych, która tworzy pojedynczy podpis, MAC, dla wszystkich danych. Następnie nadawca wysyła wszystkie podpisane elementy danych wraz z komputerem MAC do odbiornika (zazwyczaj aplikacja). Odbiorca przekazuje dane przez tę samą funkcję kryptograficzną, aby wygenerować komputer MAC i porównać je z adresem MAC, który został wysłany. Jeśli adres MAC jest zgodny, dane nie zostały zmodyfikowane.
Aby przeprowadzić uwierzytelnianie mac, aplikacja lub dostawca usług wymaga klucza szyfrowania i zgodnego certyfikatu. Aby uzyskać informacje o tym, gdzie je uzyskać, zobacz Tools for Development.
W poniższych krokach opisano sposób, w jaki dane są podpisane przez nadawcę, a następnie sprawdzane przez odbiorcę. W Menedżerze urządzeń z systemem Windows Media dostawca usług używa klasy CSecureChannelServer do generowania biblioteki MACs, a aplikacja używa klasy CSecureChannelClient. Obie klasy zapewniają identyczne funkcje z identycznymi parametrami, więc poniższe kroki dotyczą obu klas.
Nadawca (zazwyczaj dostawca usług):
- Pobierz dane do podpisania.
- Utwórz nowy uchwyt MAC, wywołując MACInit.
- Dodaj element danych do podpisania do dojścia, wywołując MACUpdate. Ta funkcja akceptuje wcześniej utworzony uchwyt oraz fragment danych, które muszą być podpisane.
- Powtórz krok 3 z każdym dodatkowym elementem danych, które muszą być podpisane. Nie ma znaczenia, jakie dane kolejności są dodawane do komputera MAC.
- Skopiuj komputer MAC z dojścia do nowego buforu bajtów, wywołując MACFinal. Ta funkcja akceptuje uchwyt MAC i bufor przydzielany, a następnie kopiuje mac z uchwytu do dostarczonego buforu.
Podczas uwierzytelniania mac ważne jest, aby zarówno nadawca, jak i odbiorca umieszczali te same dane na komputerze MAC. W przypadku metod aplikacji, które zapewniają komputer MAC, zazwyczaj wszystkie parametry są uwzględniane w wartości MAC (z wyjątkiem samego komputera MAC, oczywiście). Rozważmy na przykład metodę IWMDMOperation::TransferObjectData:
HRESULT TransferObjectData(BYTE* pData, DWORD* pdwSize, BYTE[WMDM_MAC_LENGTH] abMac);
W tej metodzie komputer MAC będzie zawierać pData i pdwSize. Jeśli nie dołączysz obu parametrów, utworzony komputer MAC nie będzie zgodny z adresem MAC przekazanym do abMac. Dostawca usług musi mieć pewność, że wszystkie wymagane parametry w metodzie aplikacji zostaną umieszczone w wartości MAC.
Poniższy kod C++ demonstruje tworzenie komputera MAC w implementacji dostawcy usług IMDSPStorageGlobals::GetSerialNumber.
HRESULT CMyDevice::GetSerialNumber(
PWMDMID pSerialNumber,
BYTE abMac[WMDM_MAC_LENGTH])
{
HRESULT hr;
// g_pSecureChannelServer is a global CSecureChannelServer object
// created earlier.
// Standard check that the CSecureChannelServer was authenticated previously.
if ( !(g_pSecureChannelServer->fIsAuthenticated()) )
{
return WMDM_E_NOTCERTIFIED;
}
// Call a helper function to get the device serial number.
hr = UtilGetSerialNumber(m_wcsName, pSerialNumber, TRUE);
if(hr == HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED))
{
hr = WMDM_E_NOTSUPPORTED;
}
if(hr == S_OK)
{
// Create the MAC handle.
HMAC hMAC;
hr = g_pSecureChannelServer->MACInit(&hMAC);
if(FAILED(hr))
return hr;
// Add the serial number to the MAC.
g_pSecureChannelServer->MACUpdate(hMAC, (BYTE*)(pSerialNumber), sizeof(WMDMID));
if(FAILED(hr))
return hr;
// Get the created MAC value from the handle.
g_pSecureChannelServer->MACFinal(hMAC, abMac);
if(FAILED(hr))
return hr;
}
return hr;
}
Odbiornik (zazwyczaj aplikacja):
Jeśli odbiornik nie zaimplementował interfejsu IWMDMOperation3, powinien wykonać te same kroki co nadawca, a następnie porównać dwie wartości MAC. W poniższym przykładzie kodu C++ pokazano, jak aplikacja sprawdzi komputer MAC odebrany w wywołaniu IWMDMStorageGlobals::GetSerialNumber, aby upewnić się, że numer seryjny nie został naruszony podczas przesyłania.
//
// Get and verify the serial number.
//
WMDMID serialNumber;
BYTE receivedMAC[WMDM_MAC_LENGTH];
hr = pIWMDMDevice->GetSerialNumber(&serialNumber, receivedMAC);
// Check the MAC to guarantee the serial number has not been tampered with.
if (hr == S_OK)
{
// Initialize a MAC handle,
// add all parameters to the MAC,
// and retrieve the calculated MAC value.
// m_pSAC is a global CSecureChannelClient object created earlier.
HMAC hMAC;
BYTE calculatedMAC[WMDM_MAC_LENGTH];
hr = m_pSAC->MACInit(&hMAC);
if(FAILED(hr))
return hr;
hr = m_pSAC->MACUpdate(hMAC, (BYTE*)(&serialNumber), sizeof(serialNumber));
if(FAILED(hr))
return hr;
hr = m_pSAC->MACFinal(hMAC, (BYTE*)calculatedMAC);
if(FAILED(hr))
return hr;
// If the two MAC values match, the MAC is authentic.
if (memcmp(calculatedMAC, receivedMAC, sizeof(calculatedMAC)) == 0)
{
// The MAC is authentic; print the serial number.
CHAR* serialNumberBuffer =
new CHAR[serialNumber.SerialNumberLength + 1];
ZeroMemory(serialNumberBuffer,
(serialNumber.SerialNumberLength + 1) * sizeof(CHAR));
memcpy(serialNumberBuffer, serialNumber.pID,
serialNumber.SerialNumberLength * sizeof(CHAR));
// TODO: Display the serial number.
delete serialNumberBuffer;
}
else
{
// TODO: Display a message indicating that the serial number MAC
// does not match.
}
}
Tematy pokrewne