哈希數據是由任何類型的內容和內容的 哈希 所組成。 當只需要確認訊息內容自哈希建立以來未被修改時,可以使用這個方法。
建立哈希訊息時,可能會有多個哈希演算法和多個哈希。 下圖描述編碼哈希訊息所需的工作。 此程式會在圖例後面的文字中描述。
建立哈希訊息
- 取得指向要哈希的資料的指標。
- 選取要使用的哈希演算法。
- 使用哈希算法將數據放入哈希函數。
- 包含要哈希的原始數據、哈希演算法,以及編碼訊息中的哈希。
若要使用低階訊息函式來完成剛才概述的工作,請使用下列程式。
使用低階訊息函式來哈希和編碼訊息
建立或擷取要哈希的內容。
取得密碼編譯提供者。
初始化 CMSG_HASHED_ENCODE_INFO 結構。
呼叫 CryptMsgCalculateEncodedLength,以取得編碼訊息 BLOB 的大小。 為其配置記憶體。
呼叫 CryptMsgOpenToEncode,傳入 CMSG_HASHED 作為 dwMsgType 參數,以及指向 CMSG_HASHED_ENCODE_INFO 的指標作為 pvMsgEncodeInfo 參數。 因為這個呼叫,您取得了已開啟訊息的控制代碼。
呼叫 CryptMsgUpdate ,傳入步驟 5 中擷取的句柄,以及要哈希和編碼的數據指標。 您可以視需要呼叫此函式,以完成編碼程式。
呼叫 CryptMsgGetParam,傳入步驟 5 中擷取的句柄和適當的參數類型,以存取所需的編碼數據。 例如,傳遞 CMSG_CONTENT_PARAM 以取得整個 PKCS #7 訊息的指標。
如果此編碼結果需做為另一個編碼訊息(例如信封訊息)的 內部數據,則必須傳遞 CMSG_BARE_CONTENT_PARAM。 如需顯示此例子的範例,請參閱 用於編碼信封訊息的替代程式碼。
此程式的結果是包含原始數據的編碼訊息、哈希演算法,以及該數據的 哈希。 在步驟 7 中,將獲得指向編碼訊息 BLOB 的指標。
下列兩個步驟將解碼並驗證雜湊數據。
解碼雜湊數據
- 取得編碼 BLOB 的指標。
- 呼叫 CryptMsgOpenToDecode,並傳遞必要的自變數。
- 呼叫 CryptMsgUpdate 一次,傳遞步驟 2 中擷取的控制代碼,以及要譯碼的資料指標。 這會根據訊息類型,對訊息採取適當的動作。
- 呼叫 CryptMsgGetParam,傳入步驟 2 中擷取的控制代碼,以及適當的參數類型以存取所需的解碼數據。 例如,傳入CMSG_CONTENT_PARAM以取得解碼內容的指標。
驗證哈希
- 呼叫 CryptMsgControl,傳入 CMSG_CTRL_VERIFY_HASH 以驗證哈希。
- 呼叫 CryptMsgClose 以關閉訊息。
如需範例程式,請參閱 範例 C 程式:編碼和譯碼哈希訊息。