MD5, HMAC Avec OpenSSL
J'ai essayé de générer MD5, HMAC avec OpenSSL & la plupart du code est emprunté. Le hmac d'être est de générer incorrect:
#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <syslog.h>
#include <string.h>
#include <openssl/engine.h>
#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
unsigned char* key = (unsigned char*) "2012121220121212201212122012121220121212201212122012121220121212";
unsigned char* data = (unsigned char*) "johndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoe";
unsigned char* expected = (unsigned char*) "abcd1d87dca34f334786307d0da4fcbd";
unsigned char* result;
//unsigned int result_len = 16;
unsigned int result_len = 16;
int i;
static char res_hexstring[32];
//result = HMAC(EVP_sha256(), key, 4, data, 28, NULL, NULL);
result = HMAC(EVP_md5(), key, 32, data, 28, NULL, NULL);
for (i = 0; i < result_len; i++) {
sprintf(&(res_hexstring[i * 2]), "%02x", result[i]);
}
if (strcmp((char*) res_hexstring, (char*) expected) == 0) {
printf("Test ok, result length %d\n", result_len);
} else {
printf("Got %s instead of %s\n", res_hexstring, expected);
}
}
Le hachage produit est incorrect. Je vous serais reconnaissant de certains commentaires, ou quelqu'un de me pointer dans la bonne direction.
OriginalL'auteur ukhan | 2012-11-25
Vous devez vous connecter pour publier un commentaire.
La troisième et la cinquième paramètres de l'algorithme HMAC sont tout simplement faux. Vous devez passer la longueur de la clé et la longueur des données. Dans votre exemple, c'est respectivement de 64 et 84 au lieu de 32 et 28.
Donc :
Avec cette modification, il semble fonctionner correctement.
OriginalL'auteur Remi Gacogne
Vous pouvez faire le tout-en-un OpenSSL HMAC commande plus propre, si vous écrivez:
result = HMAC(EVP_md5(), key, sizeof(key)-1, data, sizeof(data)-1, NULL, NULL);
Parce que
key
etdata
sont initialisés avec des littéraux de chaîne, le dernier char de la fois est\0
. Ce caractère de fin ne doit pas être haché. Nous ignorions ce personnage en spécifiant la taille du tableau moins le dernier char.Vous pouvez obtenir d'autres Vecteurs de Test pour HMAC-MD5 du https://tools.ietf.org/html/rfc2202.
sizeof(key) - 1
etsizeof(data) - 1
sikey
etdata
sont initialisés avec des littéraux de chaîne. La raison: des tableaux de char initialisé avec une chaîne littérale comme"johndoe"
sont ajoutés avec le\0
caractère. Ainsi, le correspondant char tableau présente la séquence de caractèresjohndoe\0
. Habituellement, le\0
ne doit pas être haché, parce que c'est un C/C++ d'un comportement particulier.OriginalL'auteur rustyMagnet
Utilisation
Au lieu de
Il travaille généralement pour tout données & clé
strlen
sur une clé est un non-sens. Les données peuvent arriver à être le texte, ou il ne peut pas, afin de l'appelantstrlen
peut ou peut ne pas être de droite.OriginalL'auteur Yogeesh H T