Comment utiliser PKCS5_PBKDF2_HMAC_SHA1()
Je suis en train d'utiliser PKCS5_PBKDF2_HMAC_SHA1()
et ci-dessous est mon exemple de programme. Je voulais m'assurer si mon résultat de PKCS5_PBKDF2_HMAC_SHA1()
est correct, j'ai donc vérifié la même chose avec le site http://anandam.name/pbkdf2/ et je vois un résultat différent. Suis-je à l'aide de l'API correctement?
Je vais avoir des doutes si je suis de passage le sel de la valeur correctement.
J'ai collé mon résultat et le site web de résultat après le programme.
Merci de m'aider à comprendre cela.
#include <stdio.h>
#include <types.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <openssl/engine.h>
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <proto.h>
#define KEY_LEN 32//32 bytes - 256 bits
#define KEK_KEY_LEN 5
#define ITERATION 1000
unsigned char salt_value[KEY_LEN];
unsigned char AESkey[KEY_LEN];
unsigned char XTSkey[KEY_LEN];
u8 fuse_key[KEY_LEN];
void main()
{
s32 i=0;
s32 len =0;
u8 *out;
u8 *rspHMAC;
const s8 pwd[] = "test";
s8 rspPKCS5[KEK_KEY_LEN * 2];
s32 ret;
rspHMAC = (unsigned char *) malloc(sizeof(char) * KEY_LEN);
out = (unsigned char *) malloc(sizeof(char) * KEK_KEY_LEN);
RAND_bytes(salt_value, KEY_LEN);
printf("\n salt_value[0] = %x; salt_value[31]= %x", salt_value[0], salt_value[31]);
printf("\n strlen(salt_value) = %d; sizeof(salt_value) = %d\n", strlen(salt_value), sizeof(salt_value));
for(i = 0; i < KEY_LEN; i++) {
printf("%02x", salt_value[i]);
}
ret = PKCS5_PBKDF2_HMAC_SHA1(pwd, strlen(pwd), salt_value, strlen(salt_value), ITERATION, KEK_KEY_LEN, out);
printf("\n PKCS#5 :");
for(len = 0; len < KEK_KEY_LEN; len++){
printf("%02x", out[len]);
sprintf(&rspPKCS5[len * 2], "%02x", out[len]);
}
printf("\n");
}
Exemple De Sortie:
salt_value[0] = e2; salt_value[31]= 12
strlen(salt_value) = 32; sizeof(salt_value) = 32
e258017933f3e629a4166cece78f3162a3b0b7edb2e94c93d76fe6c38198ea12
PKCS#5 :7d7ec9f411
Notre site web:
The derived 40-bit key is: a5caf6a0d3
Liées, il y a maintenant une page de man pour
PKCS5_PBKDF2_HMAC
et PKCS5_PBKDF2_HMAC_SHA1
. Voir PKCS5_PBKDF2_HMAC (3)
.OriginalL'auteur pkumarn | 2012-03-19
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, regardons un officiel vecteur de test pour PBKDF2 HMAC-SHA1:
Alors maintenant, nous savons ce que nous sommes en prise de vue à la fois sur le web et dans votre programme. Donc, en utilisant cette info, nous découvrons que le site web se veut de votre sel que d'une chaîne de caractères ASCII, il va ensuite convertir en octets. Ceci est important parce que vous ne serez jamais en mesure de correspondre à la page web de la sortie si vous utilisez
RAND_bytes
pour générer un sel.Et que vous utilisez le sel de manière incorrecte. Dans votre ligne de commentaires, vous êtes la génération d'une chaîne de caractères ASCII. Si vous souhaitez utiliser que du sel, vous devez le déclarer comme un tableau d'octets. De Plus, il vous manque un chiffre.
Et dans le décommenté code, vous êtes la génération d'un tableau d'octets, mais de les traiter comme une chaîne de caractères. Vous n'appelez pas
strlen
sur un tableau d'octets car les tableaux d'octets peut contenir 0, strlen s'interpréter comme un terminateur null. Afin de vous effectuer un suivi de la taille manuellement (par exemple, votre KEK_KEY_LEN définir pour l'ensemble de malloc) ou d'utilisersizeof
le cas échéant.Maintenant que nous savons de toutes ces choses, nous pouvons mettre sur pied un programme complet qui correspond à la sortie du site internet, et que l'agent vecteur de test.
(et note que les principaux besoins pour retourner un
int
et vous devez libérer votre mémoire allouée)Le document que j'ai lié a un vecteur de test qui permettra de repérer des erreurs dans un fichier binaire de mise en œuvre en utilisant le mot de passe "pass\0word" et le sel "sa\0lt". Le
\0
représente l'octet 0x00. Si votre application peut passer tous les test de vecteur de cas de test, il est alors considéré comme fonctionnellement correct.Merci pour la réponse, @indiv. Votre solution a fonctionné pour moi, mais j'ai dû utiliser strlen(salt_value) au lieu de sizeof(salt_value) dans l'appel à PKCS5_PBKDF2_HMAC_SHA1().
Je ne sais pas pourquoi c'est le cas (mais j'imagine que vous êtes en utilisant sizeof sur un pointeur à la place de tableau), mais être prudent avec
strlen
.strlen
arrête le balayage à la première 0x00 octet. Si vous utilisez un fichier binaire (sans texte) de sel, tous les octets avec la valeur 0 permet de le casser. E. g., pour ce sel,unsigned char salt_value[] = {0x00, 0x01, 0x02};
, vous obtiendrez un strlen de 0, ce qui est faux. Si vous utilisez uniquement le texte (ASCII) les cordes pour le sel, vous devriez être bien.OriginalL'auteur indiv