今天我了解到"密码"倾向于表示任意数量字符的可记忆字符串,而"密钥"表示高度随机的字符串(基于所使用的加密算法的特定长度).
所以今天我第一次听说了Key推导函数的概念.
我对如何从任意长度的密码(在PHP中)派生32字节密钥感到困惑.
以下方法有效但忽略了 "[盐]应随机生成"的说明(钠也是如此):
$salt = 'this salt remains constant';
$iterations = 10;
$length = 32;
$aesKey = hash_pbkdf2('sha256', $somePasswordOfArbitraryLength, $salt, $iterations, $length, false);
Run Code Online (Sandbox Code Playgroud)
以下方法也有效,但也不是很正确:
$hash = password_hash($somePasswordOfArbitraryLength, PASSWORD_BCRYPT, ['cost' => $iterations]);
$aesKey = substr($hash, -$length);//this smells weird
Run Code Online (Sandbox Code Playgroud)
通过我的所有搜索,我很惊讶我没有在PHP中找到一种"官方"方式来确定性地从密码中获取32字节密钥.
我该怎么办?
PS我在PHP中使用Laravel并希望使用AES-256-CBC加密,如下所示:
$encrypter = new \Illuminate\Encryption\Encrypter($aesKey, 'AES-256-CBC');
$encryptedText = $encrypter->encrypt($text);
Run Code Online (Sandbox Code Playgroud)
Laravel的加密助手(例如Crypt::encryptString('Hello world.'))似乎不符合我的要求,因为我希望每个用户的数据根据每个人的密码单独加密.
无论我使用哪种密钥派生函数,每次都会产生相同的密钥,因为我将使用对称加密来解密用户使用该密钥加密的字符串.
除了DES,3DES和AES加密技术之外,我还实施了PBE.与其他三个相比,我需要PBE的一些优势.当我在互联网上搜索时,我只是发现了缺点.帮我弄清楚使用PBE的一些优点?