Мне нужно написать упрощенный API шифрования, который может легко работать с симметричным шифрованием, используя либо сгенерированный случайным образом ключ, либо ключ, полученный из пароля.
Генерация пароля выполняется с помощью функции PKCS5_PBKDF2_HMAC() из библиотеки OpenSSL и с использованием EVP_sha256() в качестве алгоритма хэширования и случайно сгенерированной 16-байтовой соли.
Симметричное шифрование выполняется с помощью OpenSSL EVP API.
У меня вопрос: насколько (не)безопасно использовать соль для получения пароля также в качестве IV для шифрования?
Причина этого вопроса в том, что это позволит мне упростить API и поток вывода следующим образом:
- для процедуры шифрования пользователь должен будет предоставить либо пароль, либо секретный ключ; на основе того, что предоставлено, код может решить, нужно ли извлекать ключ из пароля или использовать предоставленный ключ как есть;
- аналогично, для процедуры расшифровки пользователь должен будет предоставить либо пароль, либо секретный ключ; в зависимости от того, что предоставлено, ключ может быть повторно получен из пароля и IV, который также действует как соль пароля (и помещается первым в выходной поток, прямо перед зашифрованным текстом);
- выходной поток будет состоять только из IV, соединенных с зашифрованным текстом, что исключает отдельную соль;
- выходной поток будет одинаковым для случайного ключа или ключа, полученного из пароля.
Примечание. API автоматически позаботится о генерации соли/IV, которая генерируется случайным образом для каждого сеанса шифрования, поэтому даже при повторном использовании пароля ключ гарантированно будет другим.
Заранее спасибо за ваши ответы.
(salt,IV,cypher)
вы передаете 2-кортеж(rand,cypher)
. приемник получает соль и IV из рандов. Это правильно? - person inquisitive   schedule 01.12.2013