4.10. Deriving Symmetric Keys from a Password
Problem
You do not want passwords to be stored on disk. Instead, you would like to convert a password into a cryptographic key.
Solution
Use PBKDF2, the password-based key derivation function 2, specified in PKCS #5.[3]
Tip
You can also use this recipe to derive keys from other keys. See Recipe 4.1 for considerations; that recipe also discusses considerations for choosing good salt values.
Discussion
Passwords can generally vary in length, whereas symmetric keys are almost always a fixed size. Passwords may be vulnerable to guessing attacks, but ultimately we’d prefer symmetric keys not to be as easily guessable.
The function spc_pbkdf2(
)
in
the following code is an implementation of PKCS #5, Version 2.0. PKCS
#5 stands for "Public Key Cryptography Standard
#5,” although there is nothing public-key-specific
about this standard. The standard defines a way to turn a password
into a symmetric key. The name of the function stands for
“password-based key derivation function
2,” where the 2 indicates that the function
implements Version 2.0 of PKCS #5.
#include <stdio.h> #include <string.h> #include <openssl/evp.h> #include <openssl/hmac.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> /* for htonl */ #ifdef WIN32 typedef unsigned _ _int64 spc_uint64_t; #else typedef unsigned long long spc_uint64_t; #endif /* This value needs to be the output size of your pseudo-random function (PRF)! */ #define PRF_OUT_LEN 20 /* This ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access