다음을 통해 공유


암호화 및 암호 해독

Windows Media Device Manager를 사용하려면 서비스 공급자와 애플리케이션 간에 전송된 파일의 암호화가 필요합니다. 이 작업은 다음 두 가지 방법 중 하나로 수행할 수 있습니다.

  • 서비스 공급자가 IMDSPObject::ReadIMDSPObject::Write지원하는 경우 CSecureChannelClientCSecureChannelServer 메서드를 사용하여 애플리케이션 및 서비스 공급자가 데이터를 암호화하고 암호 해독해야 합니다.
  • 서비스 공급자가 IMDSPObject2::ReadOnClearChannel 및 IMDSPObject2::WriteOnClearChannel지원하는 경우 애플리케이션은 비용이 많이 드는 보안 채널 메시지 인증을 방지할 수 있습니다. (IMDSPObject2 구현하지 않는 레거시 서비스 공급자가 계속 작동할 수 있도록 보안 채널이 유지됩니다.)

암호화 요구 사항은 악의적인 애플리케이션이 소프트웨어 구성 요소 간에 전달되는 데이터를 가져오지 못하게 하고 디바이스에서 전송되는 데이터의 무결성을 보호합니다.

다음 세 가지 방법에는 암호화 또는 암호 해독이 필요합니다.

메서드 묘사
IWMDMOperation::TransferObjectData (애플리케이션) 애플리케이션이 데이터를 보내거나 받는지 여부에 따라 암호화 또는 암호 해독
IMDSPObject::읽기 (서비스 공급자) 암호화.
IMDSPObject::Write (서비스 공급자) 암호 해독.

 

암호화 및 암호 해독은 모두 단일 메서드 호출에 의해 수행됩니다. 암호화는 CSecureChannelClient::EncryptParam 애플리케이션 또는 서비스 공급자에 대한 CSecureChannelServer::EncryptParam수행됩니다. 암호 해독은 CSecureChannelClient::D ecryptParam 애플리케이션 또는 서비스 공급자에 대한 CSecureChannelServer::D ecryptParam수행됩니다. 매개 변수는 클라이언트와 서버 메서드 간에 동일합니다.

다음 단계에서는 데이터를 암호화하고 암호 해독하는 방법을 보여 있습니다. (이러한 단계는 애플리케이션이 IWMDMOperation3::TransferObjectDataOnClearChannel구현하지 않는 레거시 서비스 공급자와 통신하는 경우에만 중요합니다.

암호화

  1. 메시지 인증설명된 대로 암호화된 데이터에 대한 MAC 키를 만듭니다.
  2. 암호화할 데이터로 EncryptParam 호출하여 현재 위치 암호화를 수행합니다.

다음 코드 예제에서는 IMDSPObject::Read서비스 공급자의 구현을 보여 줍니다. 이 메서드는 데이터를 사용하여 암호화하고 데이터의 크기를 사용하여 MAC 키를 만들고 둘 다 애플리케이션에 보냅니다.

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

암호 해독

  1. 암호화할 데이터로 DecryptParam 호출하여 현재 위치 암호 해독을 수행합니다.
  2. 메시지 인증설명된 대로 암호 해독된 데이터에 대한 MAC 키를 확인합니다.

다음 코드 예제에서는 IMDSPObject::Write서비스 공급자의 구현을 보여 줍니다. 이 메서드는 데이터를 사용하여 암호화하고 데이터의 크기를 사용하여 MAC 키를 만들고 둘 다 애플리케이션에 보냅니다.

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

보안 인증 채널사용하는