Я вижу ряд проблем с этим дизайном с точки зрения безопасности. Прежде всего, пароли никогда не должны быть зашифрованы, это уязвимость, обозначенная CWE-257 .
Более того * MySQL AES_ENCRYPT()
является полным мусором по нескольким причинам. Он использует режим EBC, и вот хороший пример того, почему это дерьмо:
Исходное изображение:
EBC Mode (это то, что использует mysql AES_ENCRYPT()
):
Но если взломанная база данных, злоумышленник собирается победить AES_ENCRYPT()
, включив журнал запросов .
Следует избегать использования пароля пользователя для шифрования, вы должны использовать одноразовый шифровальный код. Если вы используете пароль, убедитесь, что вы используете функцию String2Key. Вы также должны использовать режим CBC или CMAC с случайным iv . Я действительно не понимаю, как асимметричная криптография может помочь. Асимметричная криптография очень медленная, интенсивная память. Эти данные, которые он защищает, становятся менее безопасными, когда злоумышленник контролирует сообщение, потому что вы можете сравнить шифрованные текстовые сообщения. Вот почему случайный IV важен , и в асимметричном мире у вас нет такого уровня защиты.
Генерация ключей должна выглядеть примерно так:
$key=string2key($base_nonce.$salt.$user_password)
Убедитесь, что выходные данные вашей функции string2key имеют тот же размер, что и ваше пространство клавиш. Таким образом, AES 128 нуждается в 128-битном ключе. Каждый пароль должен иметь свой собственный $salt
, а $base
- это криптографический одноразовый номер, хранящийся в текстовом файле. (Злоумышленнику придется прочитать этот файл, прежде чем он сможет взломать ключ, если это значение велико, например, 128 бит, то это спорная точка.) Каждое сообщение должно иметь свой собственный $iv
, и это значение также должно быть одноразовым шифрованием (аналогично в соль). Я бы сгенерировал $salt
, $iv
и $base_nonce
из /dev/urandom
. IV может храниться в виде простого текста в столбце в вашей базе данных вместе с зашифрованным текстом.
С юридической точки зрения, даже если вы создаете защищенную криптографическую систему, у вас все еще есть проблемы с внутренними угрозами, и если сервер полностью взломан, все данные все равно будут взломаны. Это действительно не инженерная проблема.
Лучшая защита от правовой угрозы - это строгие условия, написанные опытным юристом.