Esta es una pregunta muy básica, pero ¿cuál es la diferencia entre EVP y HMAC? EVP es un compendio de mensajes, pero ¿cómo difiere eso de lo que genera HMAC?Uso de funciones HMAC vs EVP en OpenSSL
Respuesta
... ¿cuál es la diferencia entre EVP y HMAC
EVP_*
funciones son una interfaz de alto nivel. HMAC_*
, AES_*
y amigos son primitivos de nivel inferior. Puede trabajar con cualquiera de ellos, pero se recomienda que trabaje con las funciones EVP_*
. Las rutinas HMAC_*
están basadas en software y no usan hardware.
Las funciones EVP_*
le permitirán intercambiar fácilmente diferentes valores hash y el código permanece esencialmente igual. Y aprovechará la aceleración de hardware, como AES-NI para un AES-CMAC, si está disponible.
Aquí hay un ejemplo de OpenSSL basado en 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");
Ahora, y HMAC es ligeramente diferente a un Hash. El HMAC es un hash con clave, mientras que el hash no está codificado. También puede usar las funciones EVP_*
para HMAC'ing. A continuación es de la página wiki de 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");
La interfaz de bajo nivel sería similar a:
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");
Es necesario utilizar EVP_PKEY_new_mac_key función con el fin de obtener la estructura llave correcta para HMAC. Y no olvides liberarlo con EVP_PKEY_free.
- 1. OpenSSL utilizando EVP vs API algoritmo de criptografía simétrica
- 2. ¿Qué significa EVP de OpenSSL?
- 3. openssl hmac usando aes-256-cbc
- 4. ¿Cómo uso OpenSSL con WinSock?
- 5. ¿Cómo generar HMAC-SHA1 en C#?
- 6. Uso del cifrado de openssl con Java
- 7. Funciones vs métodos en Scala
- 8. funciones estáticas vs funciones const
- 9. Botan vs OpenSSL vs Crypto ++ para la criptografía
- 10. Uso de una clave para Cifrado y HMAC
- 11. HMAC-SHA1 en bash
- 12. funciones vs código repetido
- 13. C++ Funciones de miembros vs funciones gratuitas
- 14. funciones Freemarker vs macros
- 15. Lisp: macros vs funciones
- 16. Android HMAC-SHA1 Diferente al estándar Java HMAC-SHA1
- 17. Uso de claves RSA generadas por Crypto ++ en OpenSSL
- 18. PDO vs pg_ * funciones
- 19. Funciones vs procedimientos almacenados
- 20. F # Funciones vs. Valores
- 21. vs. funciones estáticas privadas en C++
- 22. Scala: funciones normales vs funciones agrupadas?
- 23. hmac sha-256 en perl
- 24. funciones de Ruby vs métodos
- 25. OpenSSL con motor GOST
- 26. tabla de funciones vs switch en golang
- 27. Php (eval vs call_user_func vs funciones variables ...)
- 28. Javascript - Argumentos Vs Funciones anidadas Vs Performance
- 29. Ruby y PHP HMAC no están de acuerdo
- 30. ¿Qué son y cómo uso los pares de OpenSSL BIO?
Hay un problema importante con su código. '' 'key''' no es' '' unsigned char''' array, es '' 'EVP_PKEY'''. Además, hay algunos errores tipográficos. – jcoffland
He buscado cómo crear EVP_PKEY (más en http://wiki.openssl.org/index.php/EVP_Key_and_Parameter_Generation) –
¿Cómo usar esto para calcular CMAC? – user489152