Autentikasi Pesan
Autentikasi pesan adalah proses yang memungkinkan aplikasi dan penyedia layanan untuk memverifikasi bahwa data yang diteruskan di antara mereka belum diubah. Windows Media Device Manager memungkinkan aplikasi dan penyedia layanan untuk melakukan autentikasi pesan dengan menggunakan kode autentikasi pesan (MAC). Berikut adalah cara kerja autentikasi MAC:
Pengirim data, biasanya penyedia layanan, meneruskan satu atau beberapa bagian data melalui fungsi kriptografi satu arah yang menghasilkan satu tanda tangan, MAC, untuk semua data. Pengirim kemudian mengirim semua potongan data yang ditandatangani bersama dengan MAC ke penerima (biasanya aplikasi). Penerima meneruskan data melalui fungsi kriptografi yang sama untuk menghasilkan MAC dan membandingkannya dengan MAC yang dikirim. Jika MAC cocok, data belum dimodifikasi.
Untuk melakukan autentikasi MAC, aplikasi atau penyedia layanan memerlukan kunci enkripsi dan sertifikat yang cocok. Untuk informasi tentang tempat mendapatkannya, lihat Alat untuk Pengembangan.
Langkah-langkah berikut menjelaskan bagaimana data ditandatangani oleh pengirim, dan kemudian diperiksa oleh penerima. Di Windows Media Device Manager, penyedia layanan menggunakan kelas CSecureChannelServer untuk menghasilkan MAC, dan aplikasi menggunakan kelas CSecureChannelClient . Kedua kelas menyediakan fungsi yang identik dengan parameter yang identik, sehingga langkah-langkah berikut berlaku untuk kedua kelas.
Pengirim (biasanya penyedia layanan):
- Dapatkan data yang akan ditandatangani.
- Buat handel MAC baru dengan memanggil MACInit.
- Tambahkan sepotong data yang akan ditandatangani ke handel dengan memanggil MACUpdate. Fungsi ini menerima handel yang dibuat sebelumnya, ditambah sepotong data yang harus ditandatangani.
- Ulangi langkah 3 dengan setiap bagian data tambahan yang harus ditandatangani. Tidak masalah dalam data pesanan apa yang ditambahkan ke MAC.
- Salin MAC dari handel ke buffer byte baru dengan memanggil MACFinal. Fungsi ini menerima handel MAC dan buffer yang Anda alokasikan, dan menyalin MAC dari handel ke dalam buffer yang disediakan.
Saat melakukan autentikasi MAC, penting bahwa pengirim dan penerima memasukkan data yang sama ke dalam MAC. Untuk metode aplikasi yang menyediakan MAC, biasanya semua parameter disertakan dalam nilai MAC (kecuali untuk MAC itu sendiri, tentu saja). Misalnya, pertimbangkan metode IWMDMOperation::TransferObjectData :
HRESULT TransferObjectData(BYTE* pData, DWORD* pdwSize, BYTE[WMDM_MAC_LENGTH] abMac);
Dalam metode ini, MAC akan menyertakan pData dan pdwSize. Jika Anda tidak menyertakan kedua parameter, MAC yang Anda buat tidak akan cocok dengan MAC yang diteruskan ke abMac. Penyedia layanan harus memastikan untuk menempatkan semua parameter yang diperlukan dalam metode aplikasi ke dalam nilai MAC.
Kode C++ berikut menunjukkan pembuatan MAC dalam implementasi penyedia layanan 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;
}
Penerima (biasanya aplikasi):
Jika penerima belum menerapkan antarmuka IWMDMOperation3 , penerima harus melakukan langkah yang sama dengan pengirim, lalu membandingkan dua nilai MAC. Contoh kode C++ berikut menunjukkan bagaimana aplikasi akan memeriksa MAC yang diterima dalam panggilan ke IWMDMStorageGlobals::GetSerialNumber untuk memastikan bahwa nomor seri tidak diubah saat transit.
//
// 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.
}
}
Topik terkait