암호화 및 암호 해독
Windows Media 장치 관리자 서비스 공급자와 애플리케이션 간에 전송된 파일의 암호화가 필요합니다. 이 작업은 다음 두 가지 방법 중 하나를 통해 수행할 수 있습니다.
- 서비스 공급자가 IMDSPObject::Read 및 IMDSPObject::Write만 지원하는 경우 각각 CSecureChannelClient 및 CSecureChannelServer 메서드를 사용하여 애플리케이션 및 서비스 공급자가 데이터를 암호화하고 암호 해독해야 합니다.
- 서비스 공급자가 IMDSPObject2::ReadOnClearChannel 및 IMDSPObject2::WriteOnClearChannel을 지원하는 경우 애플리케이션은 비용이 많이 드는 보안 채널 메시지 인증을 방지할 수 있습니다. ( IMDSPObject2 를 구현하지 않는 레거시 서비스 공급자가 계속 작동할 수 있도록 보안 채널이 유지됩니다.)
암호화 요구 사항은 악의적인 애플리케이션이 소프트웨어 구성 요소 간에 전달되는 데이터를 가져오지 못하도록 방지하고 디바이스 간에 전송되는 데이터의 무결성을 보호합니다.
다음 세 가지 방법에는 암호화 또는 암호 해독이 필요합니다.
메서드 | 설명 |
---|---|
IWMDMOperation::TransferObjectData | (애플리케이션) 애플리케이션이 데이터를 보내거나 받는지 여부에 따라 암호화 또는 암호 해독. |
IMDSPObject::Read | (서비스 공급자) 암호화. |
IMDSPObject::Write | (서비스 공급자) 암호 해독. |
암호화 및 암호 해독은 모두 단일 메서드 호출을 통해 수행됩니다. 암호화는 애플리케이션용 CSecureChannelClient::EncryptParam 또는 서비스 공급자용 CSecureChannelServer::EncryptParam 에서 수행됩니다. 암호 해독은 애플리케이션에 대한 CSecureChannelClient::D ecryptParam 또는 서비스 공급자의 경우 CSecureChannelServer::D ecryptParam 에 의해 수행됩니다. 매개 변수는 클라이언트 메서드와 서버 메서드 간에 동일합니다.
다음 단계에서는 데이터를 암호화하고 암호를 해독하는 방법을 보여 있습니다. (이러한 단계는 애플리케이션이 IWMDMOperation3::TransferObjectDataOnClearChannel을 구현하지 않는 레거시 서비스 공급자와 통신하는 경우에만 중요합니다.)
암호화
- 메시지 인증에 설명된 대로 암호화된 데이터에 대한 MAC 키를 만듭니다.
- 암호화할 데이터로 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;
}
암호 해독
- 암호화할 데이터로 DecryptParam 을 호출하여 현재 위치 암호 해독을 수행합니다.
- 메시지 인증에 설명된 대로 암호 해독된 데이터에 대한 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;
}
관련 항목