Aracılığıyla paylaş


Şifreleme ve Şifre Çözme

Windows Media Cihaz Yöneticisi, hizmet sağlayıcısı ile uygulama arasında gönderilen dosyaların şifrelenmesini gerektirir. Bu işlem iki yoldan biriyle yapılabilir:

Şifreleme gereksinimi, kötü amaçlı uygulamaların yazılım bileşenleri arasında geçirilen verileri almasını önler ve ayrıca cihaza gönderilen veya cihazdan gönderilen verilerin bütünlüğünü korur.

Aşağıdaki üç yöntem şifreleme veya şifre çözme gerektirir.

Yöntem Açıklama
IWMDMOperation::TransferObjectData (Uygulama) Uygulamanın veri gönderip göndermediğine veya aldığına bağlı olarak şifreleme veya şifre çözme.
IMDSPObject::Read (Hizmet sağlayıcısı) Şifreleme.
IMDSPObject::Write (Hizmet Sağlayıcısı) Şifre çözme.

 

Şifreleme ve şifre çözme işlemlerinin her ikisi de tek yöntem çağrıları tarafından gerçekleştirilir. Şifreleme, uygulamalar için CSecureChannelClient::EncryptParam veya hizmet sağlayıcıları için CSecureChannelServer::EncryptParamtarafından yapılır. Şifre çözme işlemi uygulamalar için CSecureChannelClient::D ecryptParam veya hizmet sağlayıcıları için CSecureChannelServer::D ecryptParam. parametreler istemci ve sunucu yöntemleri arasında aynıdır.

Aşağıdaki adımlar, verilerin nasıl şifrelenip şifrelerinin çözüleceğini gösterir. (Bu adımlar yalnızca uygulamanız IWMDMOperation3::TransferObjectDataOnClearChanneluygulamayan eski bir hizmet sağlayıcısıyla iletişim kurarsa önemlidir.)

Şifreleme

  1. İleti Kimlik Doğrulamasıbölümünde açıklandığı gibi şifrelenmiş veriler için MAC anahtarını oluşturun.
  2. Yerinde şifreleme gerçekleştirmek için şifreleme verileriyle EncryptParam çağırın.

Aşağıdaki kod örneği, bir hizmet sağlayıcısının IMDSPObject::Readuygulamasını gösterir. Bu yöntem, şifrelemek için verileri ve verilerin boyutunu kullanarak MAC anahtarını oluşturur ve her ikisini de uygulamaya gönderir.

HRESULT CMyStorage::Read(
    BYTE  *pData,
    DWORD *pdwSize,
    BYTE   abMac[WMDM_MAC_LENGTH])
{
    HRESULT  hr;
    DWORD    dwToRead;         // Bytes to read.
    DWORD    dwRead   = NULL;  // Bytes read.
    BYTE    *pTmpData = NULL;  // Temporary buffer to hold data before 
                               // it is copied to pData.

    // Use a global CSecureChannelServer member to verify that 
    // the client is authenticated.
    if (!(g_pAppSCServer->fIsAuthenticated()))
    {
        return WMDM_E_NOTCERTIFIED;
    }
    

    // Verify that the handle to the file to read is valid.
    if(m_hFile == INVALID_HANDLE_VALUE)
    {
        return E_FAIL;
    }

    // Create a buffer to hold the data read.    
    dwToRead = *pdwSize;
    pTmpData = new BYTE [dwToRead] ;
    if(!pTmpData)
        return E_OUTOFMEMORY;

    // Read data into the temporary buffer.
    if(ReadFile(m_hFile,(LPVOID)pTmpData,dwToRead,&dwRead,NULL)) 
    { 
        *pdwSize = dwRead; 

        if( dwRead )
        {
            // Create a MAC from all the parameters.
            // CORg is a macro that goes to Error label on failure.
            // MAC consists of data and size of data.
            HMAC hMAC;
            
            CORg(g_pAppSCServer->MACInit(&hMAC));
            CORg(g_pAppSCServer->MACUpdate(hMAC, (BYTE*)(pTmpData), dwRead));
            CORg(g_pAppSCServer->MACUpdate(hMAC, (BYTE*)(pdwSize), sizeof(DWORD)));
            CORg(g_pAppSCServer->MACFinal(hMAC, abMac));
            
            // Encrypt the data.
            CORg(g_pAppSCServer->EncryptParam(pTmpData, dwRead));
            
            // Copy data from the temporary buffer into the out parameter.
            memcpy(pData, pTmpData, dwRead);
        }
    
        hr = S_OK; 
    }
    else
    { 
        *pdwSize = 0; 

        hr = E_FAIL; 
    }

Error:

    if(pTmpData) 
    {
        delete [] pTmpData;
    }

    return hr;
} 

şifre çözme

  1. Yerinde şifre çözme gerçekleştirmek için şifrelenmesi gereken verilerle DecryptParam çağırın.
  2. İleti Kimlik Doğrulaması açıklandığı gibi şifresi çözülen verilerin MAC anahtarını doğrulayın.

Aşağıdaki kod örneği, bir hizmet sağlayıcısının IMDSPObject::Writeuygulamasını gösterir. Bu yöntem, şifrelemek için verileri ve verilerin boyutunu kullanarak MAC anahtarını oluşturur ve her ikisini de uygulamaya gönderir.

HRESULT CMyStorage::Write(BYTE *pData, DWORD *pdwSize,
                                 BYTE abMac[WMDM_MAC_LENGTH])
{
    HRESULT  hr;
    DWORD    dwWritten = 0;
    BYTE    *pTmpData  = NULL;          // Temporary buffer to hold the 
                                        // data during decryption.
    BYTE     pTempMac[WMDM_MAC_LENGTH]; // Temporary MAC that will be 
                                        // copied into the abMac
                                        // out parameter.

    if( m_hFile == INVALID_HANDLE_VALUE )
    {
        return E_FAIL;
    }

    // Allocate the temporary buffer and copy the encrypted data into it.
    pTmpData = new BYTE [*pdwSize];
    if(!pTmpData)
        return E_OUTOFMEMORY;
    memcpy(pTmpData, pData, *pdwSize);

    // Decrypt the data.
    CHRg(g_pAppSCServer->DecryptParam(pTmpData, *pdwSize));

    // Check the MAC passed to the method. The MAC is built from
    // the data and data size parameters.
    // CORg is a macro that goes to the Error label on failure.
    HMAC hMAC;
    CORg(g_pAppSCServer->MACInit(&hMAC));
    CORg(g_pAppSCServer->MACUpdate(hMAC, (BYTE*)(pTmpData), *pdwSize));
    CORg(g_pAppSCServer->MACUpdate(hMAC, (BYTE*)(pdwSize), sizeof(*pdwSize)));
    CORg(g_pAppSCServer->MACFinal(hMAC, pTempMac));

    // If the MAC values don't match, return an error.
    if (memcmp(abMac, pTempMac, WMDM_MAC_LENGTH) != 0)
    {
        hr = WMDM_E_MAC_CHECK_FAILED;
        goto Error;
    }

    // The MAC values matched, so write the decrypted data to a local file.
    if( WriteFile(m_hFile,pTmpData,*pdwSize,&dwWritten,NULL) ) 
    {
        hr = S_OK;
    }
    else 
    {
        hr = HRESULT_FROM_WIN32(GetLastError());
    }

    *pdwSize = dwWritten;

Error:

    if( pTmpData )
    {
        delete [] pTmpData;
    }

    return hr;
}

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