Функция openssl_public_encrypt
ограничивает размер данных, которые вы можете зашифровать, до длины ключа. Если вы используете заполнение (рекомендуется), вы потеряете дополнительные 11 байтов.
Однако стандарт PKCS # 1, который использует OpenSSL, определяет схему заполнения (так что вы можете шифровать меньшие количества без потери безопасности), и эта схема заполнения занимает минимум 11 байтов (это будет больше, если значение, которое вы шифруешь поменьше). Таким образом, наибольшее количество битов, которые вы можете зашифровать с помощью 1024-битного ключа, составляет 936 битов из-за этого (если вы не отключите заполнение, добавив флаг OPENSSL_NO_PADDING, в этом случае вы можете перейти до 1023-1024 бит). С 2048-битным ключом это вместо 1960 бит.
Конечно, вы никогда не должны отключать заполнение, потому что это приведет к тому, что те же пароли будут шифроваться с тем же значением.
Таким образом, для 1024-битного ключа максимальная длина ввода пароля составляет 117 символов.
Для 2048-битного ключа это 245 символов.
Я не уверен на 100% в длине вывода, но простой след должен подтвердить это, вывод является простой функцией длины ключа, поэтому для 2048-битного ключа я подозреваю, что это 256 байтов.
Вы должны использовать строку binary
необходимой длины для хранения пароля.
По соображениям скорости лучше всего использовать ограниченный индекс длины на поле.
Не используйте blob (!), Потому что это замедлит процесс без пользы.
CREATE TABLE user
id unsigned integer auto_increment primary key,
username varchar(50) not null,
passRSA binary(256), <<-- doublecheck the length.
index ipass(passRSA(10)) <<-- only indexes the first 10 bytes for speed reasons.
) ENGINE = InnoDB
Добавление дополнительных байтов в индекс только замедлит работу и увеличит файл индекса без какой-либо выгоды.