這是一個非常基本的問題,但EVP和HMAC有什麼區別? EVP是一個消息摘要,但它與HMAC生成的有何不同?在OpenSSL中使用HMAC和EVP功能
6
A
回答
5
... EVP和HMAC
之間的區別是什麼
EVP_*
功能是一個高層次的接口。 HMAC_*
,AES_*
和朋友是較低級別的基元。您可以使用其中一種,但推薦您使用EVP_*
函數。例程HMAC_*
是基於軟件的並且不使用硬件。
EVP_*
函數將允許您輕鬆交換不同的哈希值,代碼基本保持不變。如果可用的話,您將利用硬件加速,如用於AES-CMAC的AES-NI。
這是基於https://www.openssl.org/docs/crypto/EVP_DigestInit.html的OpenSSL示例。
EVP_MD_CTX* mdctx = NULL;
const EVP_MD* md = NULL;
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len = 0;
char message[] = "Now is the time for all good men to "
"come to the aide of their country\n";
OpenSSL_add_all_digests();
md = EVP_get_digestbyname("SHA1");
mdctx = EVP_MD_CTX_create();
if(!EVP_DigestInit_ex(mdctx, md, NULL))
handleError();
if(!EVP_DigestUpdate(mdctx, message, strlen(message)))
handleError();
if(!EVP_DigestFinal_ex(mdctx, md_value, &md_len))
handleError();
if(!EVP_MD_CTX_destroy(mdctx))
handleError();
printf("Digest is: ");
for(int i = 0; i < md_len; i++)
printf("%02x", md_value[i]);
printf("\n");
現在,和HMAC略有不同。 HMAC是密鑰散列,而散列不是密鑰。您還可以使用EVP_*
函數進行HMAC處理。下面是從OpenSSL的維基EVP Signing and Verifying頁:
EVP_MD_CTX* mdctx = NULL;
const EVP_MD* md = NULL;
EVP_PKEY *pkey = NULL;
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len = 0;
char message[] = "Now is the time for all good men to "
"come to the aide of their country\n";
OpenSSL_add_all_digests();
if(!(mdctx = EVP_MD_CTX_create()))
handleError();
if(!(md = EVP_get_digestbyname("SHA1")))
handleError();
if(!(pkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, "password", strlen("password"))))
handleError();
if(1 != EVP_DigestSignInit(mdctx, NULL, md, NULL, pkey))
handleError();
/* Call update with the message */
if(1 != EVP_DigestSignUpdate(mdctx, message, strlen(message)))
handleError();
if(1 != EVP_DigestSignFinal(mdctx, md_value, &md_len))
handleError();
printf("HMAC is: ");
for(int i = 0; i < md_len; i++)
printf("%02x", md_value[i]);
printf("\n");
低層次的接口將類似於:
EVP_MD_CTX* mdctx = NULL;
const EVP_MD* md = NULL;
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len = 0;
char message[] = "Now is the time for all good men to "
"come to the aide of their country\n";
OpenSSL_add_all_digests();
md = EVP_get_digestbyname("SHA1");
mdctx = EVP_MD_CTX_create();
if(!HMAC_Init_ex(mdctx, key, sizeof(key), md, NULL))
handleError();
if(!HMAC_Update(mdctx, message, strlen(message)))
handleError();
if(!HMAC_Final(mdctx, md_value, &md_len))
handleError();
if(!HMAC_CTX_cleanup(mdctx))
handleError();
printf("HMAC is: ");
for(int i = 0; i < md_len; i++)
printf("%02x", md_value[i]);
printf("\n");
1
你需要使用EVP_PKEY_new_mac_key功能,以獲得HMAC右鍵結構。並且不要忘記用EVP_PKEY_free釋放它。
相關問題
- 1. MD5 HMAC使用OpenSSL
- 2. 使用openSSL的HMAC-MD5
- 3. openssl hmac使用aes-256-cbc
- 4. Openssl EVP從文件加密和解密
- 5. openssl 0.9.8 EVP EVP_PKEY_CTX未定義
- 6. OpenSSL的HMAC蟒蛇HMAC
- 7. Java Mac HMAC vs C++ OpenSSL hmac
- 8. 解密AES CCM 128,麥克風8位,在C使用OpenSSL EVP
- 9. 使用openssl的EVP API可以使用公鑰解密嗎
- 10. OpenSSL的EVP是什麼意思?
- 11. OpenSSL EVP AES/DES加密實現
- 12. OpenSSL的EVP隨機失敗解密
- 13. 使用openssl對文件進行加密的問題evp api(aes256cbc)
- 14. HMAC一個結構與openssl
- 15. 在OpenSSL EVP api的EVP_OpenInit()中獲取RSA解密錯誤,C
- 16. 如何驗證使用OpenSSL功能
- 17. 如何獲得OpenSSL中的HMAC密鑰
- 18. 具有FIPS功能的OpenSSL和`make depends`
- 19. 在Java中使用HMAC-Whirlpool
- 20. Python hmac和C#hmac
- 21. 自寫HMAC功能,工作不正常
- 22. 關於hmac功能的提示,登錄
- 23. 使用AES加密OpenSSL解密輸出中的字符無效libcrypto EVP API和FUSE文件系統
- 24. OpenSSL EVP API無碰撞與單向屬性MAC
- 25. 如何在功能中使用功能
- 26. 使用SHA384在C中實現HMAC
- 27. 如何在GWT中使用hmac加密
- 28. 在Web應用程序和API中使用HMAC
- 29. 在C++ Builder中使用OpenSSL
- 30. 在D中使用OpenSSL庫
您的代碼存在主要問題。 '''key'''不是一個'''unsigned char'''數組,它是'''EVP_PKEY'''。此外,還有一些錯別字。 – jcoffland
我已經挖掘出如何創建EVP_PKEY(詳見http://wiki.openssl.org/index.php/EVP_Key_and_Parameter_Generation) –
如何使用它來計算CMAC? – user489152