HKDF derive
Derive a key from input keying material with HKDF, on your device.
Runs on your device. The file is never uploaded.
HKDF derive expands hex input keying material into a hex key, 32 bytes long by default, under SHA-256. A salt and a context label can be supplied, both as hex, and both are empty until you do. Every byte input must be hex, so a passphrase typed into the ikm box is refused.
Questions
What inputs does it take?
Input key material as hex, which is required, plus an optional hex salt, optional hex context info, a hash of SHA-1, SHA-256, SHA-384 or SHA-512 defaulting to SHA-256, and an output length in bytes defaulting to 32. All three byte inputs are hex, not text. The result is the derived key as hex, from crypto.subtle.deriveBits.
Why does it reject my input?
The hex parser refuses anything that is not hex digits, or that has an odd number of digits, with "must be a hex string with an even number of digits". That catches a passphrase typed into the ikm box, and a hex string with spaces or a 0x prefix. A bad output size gives "length must be a positive whole number".
Can I use it on a password?
You should not. HKDF is fast by design and does no work to slow down guessing, because it expects input that is already high entropy, such as the output of a key exchange or a random key. For a password use PBKDF2 derive, scrypt derive or Argon2id hash, all of which are built to be expensive per attempt.
What is info for?
Domain separation. Two derivations from the same key material with different info values give unrelated outputs, which is how you get an encryption key and a MAC key from one shared secret without them being related. It is passed as hex here, so encode your label to hex first. Leaving it blank is allowed and is the default.
Is the salt required?
No. It defaults to empty, and the tool passes an empty byte string to Web Crypto in that case. A salt is not secret and does not have to be random, but including one when you have it strengthens the extract step. Whatever you choose has to be reproduced byte for byte to get the same key again, since nothing about it is stored in the output.
Where does this run?
In a Web Worker in this tab, through crypto.subtle.deriveBits. The key material you paste is imported as a non-extractable HKDF key inside the page, used once and discarded. Nothing is uploaded, nothing is stored, and the site works after you turn the network off.