Key-Derivation
是否有使用 SCRYPT 作為無限長度 KDF 而不是固定長度身份驗證雜湊的建議或標準?
我該怎麼辦?我不想自己動手,但我真的很想將 SCRYPT 用作幾種算法的 KDF,其中一些算法需要比 SHA-256 散列更長的輸出長度。否則,使用像 AES-256 這樣的加密算法,它已經是完美的尺寸了。
我是否只是操縱第二個 PBKDF2 輸出的密鑰長度?如果我是正確的,這在技術上將不再是 SCRYPT 而只是一個接近的變體?
使用 SCRYPT 散列算法作為 HKDF 或 PBKDF2 輸出中的 PRF 是否可行?
我了解如何將其用作身份驗證雜湊,但作為一個完整的 KDF,我可能沒有正確的程式碼,並且文件對我來說非常不清楚。
scrypt 的簽名,直接來自原始碼:
/** * crypto_scrypt(passwd, passwdlen, salt, saltlen, N, r, p, buf, buflen): * Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r, * p, buflen) and write the result into buf. The parameters r, p, and buflen * must satisfy r * p < 2^30 and buflen <= (2^32 - 1) * 32. The parameter N * must be a power of 2 greater than 1. * * Return 0 on success; or -1 on error. */ int crypto_scrypt(const uint8_t *, size_t, const uint8_t *, size_t, uint64_t, uint32_t, uint32_t, uint8_t *, size_t);
最後一個參數 (
buflen
) 是輸出大小。你只需給它你想要的值(並且滿足評論中的要求)。鑑於這個答案有多簡單,我猜想缺少一些上下文。可能你使用的是第三方庫,重新實現了 scrypt 或者連結到原來的,但是沒有提供這個參數給呼叫者指定。在這種情況下,好吧,那麼您有一些選擇:
- 使用提供全方位選項的不同庫;
- 嘗試對庫進行修補以支持所有選項;
- 使用基於密鑰的密鑰派生函式(如 HKDF-expand)來擴展您的庫提供的短 scrypt 輸出。