Đây là một câu hỏi rất cơ bản, nhưng sự khác biệt giữa EVP và HMAC là gì? EVP là một thông báo tiêu hóa, nhưng nó khác với những gì được HMAC tạo ra?Sử dụng các chức năng HMAC và EVP trong OpenSSL
Trả lời
... sự khác biệt giữa EVP và HMAC
là những gì
EVP_*
chức năng là một giao diện cấp cao. HMAC_*
, AES_*
và bạn bè là cấp thấp hơn nguyên thủy. Bạn cũng có thể làm việc, nhưng bạn nên làm việc với các hàm EVP_*
. Các thói quen HMAC_*
là dựa trên phần mềm và không sử dụng phần cứng.
Chức năng EVP_*
sẽ cho phép bạn dễ dàng hoán đổi trong các băm khác nhau và mã cơ bản vẫn giữ nguyên. Và bạn sẽ tận dụng khả năng tăng tốc phần cứng, như AES-NI cho AES-CMAC, nếu có.
Dưới đây là ví dụ về OpenSSL dựa trên https://www.openssl.org/docs/crypto/EVP_DigestInit.html.
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");
Hiện tại, và HMAC hơi khác với Hash. HMAC là một băm có khóa, trong khi băm không được khóa. Bạn cũng có thể sử dụng các chức năng EVP_*
cho HMAC'ing. Dưới đây là từ trang wiki của 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");
Giao diện ở mức độ thấp sẽ trông tương tự như:
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");
Bạn cần phải sử dụng EVP_PKEY_new_mac_key chức năng để có được cấu trúc quan trọng phù hợp với HMAC. Và đừng quên giải phóng nó bằng EVP_PKEY_free.
- 1. openssl hmac sử dụng aes-256-cbc
- 2. Cách sử dụng các chức năng SHA256 của OpenSSL
- 3. OpenSSL sử dụng EVP vs thuật toán API cho đối xứng crypto
- 4. C# Tạo và sử dụng Chức năng
- 5. Có thể sử dụng mã hóa chế độ CTR AES bằng API EVP không?
- 6. tinh khiết chức năng ảo và lập luận không sử dụng trong các chức năng con trong C++
- 7. Sử dụng OpenSSL với kênh tùy chỉnh
- 8. Ruby và PHP HMAC không đồng ý
- 9. sử dụng chức năng C trong C#
- 10. Sử dụng chức năng scipy.interpolate.splrep
- 11. Sử dụng chức năng PHP trong TWIG?
- 12. Chức năng gọi lại là gì và cách sử dụng chức năng này với OOP
- 13. sử dụng OpenSSL trong Visual Studio 2012
- 14. Sử dụng chức năng Chuyển qua chức năng khác nhau
- 15. Các phần chức năng và không chức năng của ứng dụng là gì?
- 16. Có thể sử dụng C# các lớp và chức năng nào trong dao cạo?
- 17. Khả năng cộng tác giữa RSACryptoServiceProvider và OpenSSL
- 18. vòng lặp chọn jquery và chức năng sử dụng mỗi
- 19. Sử dụng decltype và std :: chức năng với lambda
- 20. Sử dụng các chức năng bọc SWIG từ Windows .dll
- 21. Mật khẩu với chức năng chính tương thích với các lệnh OpenSSL?
- 22. Sử dụng các con trỏ chức năng xa
- 23. Sử dụng thực tế các chức năng đã kết hôn?
- 24. Nhạo một chức năng sử dụng các tham số
- 25. Sử dụng chức năng mapfragment offline
- 26. Robomongo, cách sử dụng các chức năng tùy chỉnh?
- 27. Ứng dụng chức năng Haskell và currying
- 28. Không thể sử dụng chức năng gọi trong chức năng bảo vệ
- 29. Lỗi mã hóa và giải mã 0x0407106B sử dụng OpenSSL
- 30. Sử dụng đầu ra argparse cho các chức năng gọi
Có vấn đề lớn với mã của bạn. '' 'key''' không phải là một mảng' '' unsigned char''', nó là '' 'EVP_PKEY'''. Ngoài ra, có một số lỗi chính tả. – jcoffland
Tôi đã tìm hiểu cách tạo EVP_PKEY (tại http://wiki.openssl.org/index.php/EVP_Key_and_Parameter_Generation) –
Cách sử dụng tính năng này để tính toán CMAC ??? – user489152