Aracılığıyla paylaş


İleti Kimlik Doğrulaması

İleti kimlik doğrulaması, uygulamaların ve hizmet sağlayıcıların aralarında geçirilen verilerin değiştirilmediğini doğrulamasını sağlayan bir işlemdir. Windows Media Device Manager, uygulamaların ve hizmet sağlayıcılarının ileti kimlik doğrulama kodlarını (MAC) kullanarak ileti kimlik doğrulaması gerçekleştirmesine olanak tanır. MAC kimlik doğrulaması şu şekilde çalışır:

Genellikle hizmet sağlayıcısı olan veri gönderen, tüm veriler için tek bir imza (MAC) oluşturan tek yönlü bir şifreleme işlevi aracılığıyla bir veya daha fazla veri parçası geçirir. Ardından gönderen, tüm imzalı veri parçalarını MAC ile birlikte alıcıya (genellikle uygulama) gönderir. Alıcı, mac oluşturmak için verileri aynı şifreleme işlevinden geçirir ve gönderilen MAC ile karşılaştırır. MAC eşleşiyorsa, veriler değiştirilmemiştir.

MAC kimlik doğrulaması gerçekleştirmek için uygulama veya hizmet sağlayıcısı bir şifreleme anahtarı ve eşleşen bir sertifika gerektirir. Bunları nereden edineceğiniz hakkında bilgi için bkz. geliştirme için araçlar.

Aşağıdaki adımlarda verilerin gönderen tarafından nasıl imzalandığı ve daha sonra alıcı tarafından nasıl denetlendiği açıklanmaktadır. Windows Media Cihaz Yöneticisi'nde hizmet sağlayıcısı MAK oluşturmak için CSecureChannelServer sınıfını, uygulama ise CSecureChannelClient sınıfını kullanır. Her iki sınıf da aynı parametrelere sahip özdeş işlevler sağlar, bu nedenle aşağıdaki adımlar her iki sınıf için de geçerlidir.

Gönderen (genellikle hizmet sağlayıcısı):

  1. İmzalanacak verileri alın.
  2. MACInitçağırarak yeni bir MAC tanıtıcısı oluşturun.
  3. MACUpdateçağırarak tanıtıcıya imzalanacak bir veri parçası ekleyin. Bu işlev, daha önce oluşturulan tanıtıcının yanı sıra imzalanması gereken bir veri parçasını kabul eder.
  4. İmzalanması gereken her ek veri parçasıyla 3. adımı yineleyin. MAC'e hangi sırada veri eklendiği önemli değildir.
  5. MACFinalçağırarak MAC'i tanıtıcıdan yeni bir bayt arabelleğine kopyalayın. Bu işlev, mac tutamacını ve ayırdığınız bir arabelleği kabul eder ve MAC'i tanıtıcıdan sağlanan arabelleğe kopyalar.

MAC kimlik doğrulamasını gerçekleştirirken, hem gönderenin hem de alıcının aynı verileri MAC'e yerleştirmesi önemlidir. MAC sağlayan uygulama yöntemleri için, genellikle tüm parametreler MAC değerine dahil edilir (elbette MAC'in kendisi hariç). Örneğin, IWMDMOperation::TransferObjectData yöntemini göz önünde bulundurun:

HRESULT TransferObjectData(BYTE* pData, DWORD* pdwSize, BYTE[WMDM_MAC_LENGTH] abMac);

Bu yöntemde MAC, pData ve pdwSizeiçerir. Her iki parametreyi de eklemezseniz, oluşturduğunuz MAC, abMac geçirilen MAC ile eşleşmez. Bir hizmet sağlayıcısı, uygulama yöntemindeki tüm gerekli parametreleri MAC değerine yerleştirmelidir.

Aşağıdaki C++ kodu, hizmet sağlayıcısının IMDSPStorageGlobals::GetSerialNumberuygulamasında MAC oluşturmayı gösterir.

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;
}

Alıcı (genellikle uygulama):

Alıcı IWMDMOperation3 arabirimini uygulamadıysa, gönderenle aynı adımları gerçekleştirmeli ve ardından iki MAC değerini karşılaştırmalıdır. Aşağıdaki C++ kod örneği, bir uygulamanın IWMDMStorageGlobals::GetSerialNumberçağrısında alınan MAC'i denetleyerek seri numarasının aktarım sırasında değiştirilmemesini nasıl denetleyeceğini gösterir.

//
// 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.
    }
}

Güvenli Kimliği Doğrulanmış KanallarKullanarak