В настоящее время я реализую простое шифрование на основе RSA следующим образом в PHP (используя openssl_public_encrypt):
// $sRawText — текстовая строка для шифрования.
// $sPublicKey — открытый ключ, хранящийся на сервере.
openssl_public_encrypt($sRawText, $sРезультат, $sPublicKey, OPENSSL_PKCS1_OAEP_PADDING);
// $sResult — это зашифрованный результат, который затем сохраняется.
Я обязательно использовал опцию заполнения OAEP, однако заполнение выполняется с помощью SHA1 вместо SHA256. PHP не имеет встроенной опции заполнения, поддерживающей SHA256. Например, криптографическая библиотека Python использует SHA256 вместо этого:
сериализация импорта из cryptography.hazmat.primitives
из cryptography.hazmat.primitives импортировать хэши
из cryptography.hazmat.primitives.асимметричное заполнение импорта
зашифрованный текст = public_key.encrypt(
сообщение,
заполнение.OAEP(
mgf=padding.MGF1(алгоритм=хэши.SHA256()),
алгоритм=хэши.SHA256(),
метка = нет
)
)
Единственный вариант для меня получить SHA256 на PHP — использовать стороннюю библиотеку, такую как PHPSecLib или EasyRSA. Я столкнулся с препятствиями через несколько часов, пытаясь установить и использовать любой из них в своей среде общего хостинга. (Было бы идеально, если бы я мог поместить один файл .php с RSA в одном месте.)
Данные зашифровываются в базу данных на онлайн-сервере, и это должно происходить в PHP, поэтому я могу вставлять новые записи, когда пользователи регистрируются (используя открытый ключ). Я хотел бы убедиться, что если зашифрованные данные базы данных и открытый ключ попадут в гнусные руки с доступом к разумному уровню вычислительной мощности, данные останутся конфиденциальными (настолько же безопасными, как атака грубой силы). Данные в чужих руках могут быть использованы для фишинга пользователей или создания мошеннических ложных заявлений.
Хранилище на стороне клиента не работает, так как данные уже находятся в базе данных в настоящее время, и мне нужны определенные поля, такие как контактная информация, чтобы связаться с пользователем. Кроме того, я чувствую, что большинство клиентов потеряют данные, которые необратимы и потенциально должны быть доступны через несколько лет. Однако я не хочу полностью доверять серверной среде, поэтому я хотел бы свести поверхность атаки только к определенным моментам использования данных. Мне гораздо проще хранить этот закрытый ключ и пароль в автономном режиме и в безопасности, чем пытаться защитить динамическую базу данных, которая постоянно меняется и нуждается в резервном хранении.
Я планирую выполнять все манипуляции с зашифрованными данными в автономном режиме и использовать зашифрованные поля базы данных только для проверки (т.е. данные совпадают с введенными пользователем данными) или для подсчета записей.Некоторые поля в базе данных не являются конфиденциальными, поэтому они не шифруются, а другие, например пароли, хэшируются.
Что я хочу знать, так это то, что если я продолжу реализацию заполнения SHA1, какие атаки это откроет для меня против противника с зашифрованными данными базы данных и открытым ключом. Как они будут реагировать на эти атаки? Помогает ли заполнение SHA256 лучше защитить данные и как?
Большое спасибо!