En utilisant PBKDF2 avec la bibliothèque OpenSSL
Je veux utiliser l'algorithme PBKDF2 avec HMAC SHA1 (basé sur cette réponse).
Comment puis-je utiliser ce par le biais de la bibliothèque crypto?
J'ai commencé par regarder man openssl
, mais le openssl passwd
de commande (page de man) ne prend en charge qu'une petite poignée d'algorithmes. En regardant les crypto de la documentation, de la dg module dispose d'un EVP_BytesToKey méthode.
Sélection rigoureuse des paramètres de fournir un fichier PKCS#5 PBKDF1 compatible mise en œuvre. Cependant, de nouvelles applications devraient généralement pas l'utiliser (en préférant, par exemple, PBKDF2 de PCKS#5).
Qui me ramène à ma question initiale, comment puis-je utiliser PBKDF2 via crypto? Ai-je besoin de creuser dans le code et d'appeler un non-API-exposé de la méthode (comme PKCS5_PBKDF2_HMAC)? (et si oui, quel est le maintien d'être exposés?)
- La langue de votre choix presque certainement dispose d'une bibliothèque qui implémente déjà PBKDF2. C'est (à mon humble avis) extrêmement préférable de les bombardements de la
openssl
ligne de commande ou à essayer de parler directement à l' (horriblement mauvais)libssl
directement l'API. - Double Possible de Comment utiliser PKCS5_PBKDF2_HMAC_SHA1(). Voir aussi Est-il de l'API C dans openssl pour dériver une clé de chaîne de caractères et Ce n'PKCS5_PBKDF2_HMAC_SHA1 valeur de retour signifie?
- "Ai-je besoin de creuser dans le code et d'appeler un non-API-exposé de la méthode (comme PKCS5_PBKDF2_HMAC)" - en Fait, c'est une API publique de la fonction. Les docs ont récemment ajouté.
PKCS5_*
est du capitole, une partie de l'API publique et peut être utilisé.pkcs5_*
est plus faible, une partie de l'API interne, et ne doit pas être utilisé (ou en risque de l'être modifiées ou supprimées). - La page de man pour
EVP_BytesToKey
est un peu ambigu, car il n'est pas explicitement appelPKCS5_PBKDF2_HMAC
. Il ne le mentionner dans la section "VOIR AUSSI", mais il y a un évident déconnecter (sinon, vous ne poseriez pas la question). Un patch a été soumis à l'aborder. Plus Un pour la lecture de la documentation et de poser la question. Merci de le signaler.
Vous devez vous connecter pour publier un commentaire.
J'ai un travail, mais pauvre C exemple de PBKDF2 via les bibliothèques OpenSSL à mon dépôt github, y compris les scripts de compilation sous Linux et Windows (via MinGW). Le code Source se trouve sous "Rejets", est bien connu; le code source dans la branche master est un WIP. Cette variante est autorisée dans les mêmes 4-clause BSD en plus de SSLeay licence OpenSSL est.
Je travaille toujours sur l'ajout de quelques fonctionnalités, puis je vais revenir à l'entrée excellent je l'ai eu sur la Révision du Code StackExchange site et de mise à niveau de C99 de la syntaxe et ainsi de suite.
Le code de base est très primitif, et peut contenir des erreurs malgré l'adoption d'une très vaste chaîne de vecteurs de test. Il n'a pas (encore) été testé contre le pur de l'entrée binaire.
Si vous avez un système 64 bits, je vous recommande fortement de passer jusqu'à PBKDF2-HMAC-SHA-512 ou PBKDF2-HMAC-SHA-384 place:
Un exemple d'utilisation serait:
ou
Utiliser un hasard, par utilisateur, sel de 8 à 16 binaire octets, soit 16 à 32 chiffres hexadécimaux - mon code n'est PAS d'avoir des exemples de générer ce encore
Peu importe ce que vous choisissez, assurez-vous de vérifier contre les vecteurs de test (quelques-uns sont en pbkdf2_test.bat/sh dans mon référentiel).
En outre, sur votre système, faites un peu de benchmarking - certainement sur le PBKDF2-HMAC-SHA-384 et PBKDF2-HMAC-SHA-512 variantes, la compilation sous un système 64 bits produit radicalement de meilleurs résultats. Le comparer à mon tout aussi pauvres C++ Crypto++ et/ou mon pauvre C PolarSSL exemples, ou Jither C# exemple de mise en œuvre, selon ce que votre système cible.
La raison pour laquelle vous soucier de la vitesse, c'est que vous devez choisir un nombre d'itérations, basé sur la performance de votre système de production a disponibles par rapport au nombre d'utilisateurs qui se connectent/créer des mots de passe aux heures de pointe, de manière à ne pas générer trop de plaintes de la lenteur.
Attaquants vont utiliser quelque chose comme oclHashcat, qui, sur un seul PC avec 8x AMD R9 290Xstock horloge de base est en mesure de tenter 3.4E12 (2^41) devine tous les 30 jours contre PBKDF2-HMAC-SHA-1(SSID que le sel, le mot de passe de 32 octets de sortie longueur, 4096 itérations, une.k.un. WPA/WPA2), qui est plus ou moins équivalent à PBKDF2-HMAC-SHA-1(sel,pw,20 octets de sortie longueur, 8192 itérations).
La différence devient important lorsque l'attaquant commence dans le choix de leurs attaques.
Maintenant, pour PBKDF2, il ya quelques autres choses à savoir: