Есть ли причина, по которой не хранить зашифрованные данные как двоичные в базе данных?
Мне нужно хранить зашифрованные данные AES-GCM в базе данных. В настоящее время мы используем MariaDB, но с возможностью позже перейти на PostgreSQL. (однако следует учитывать и другие базы данных)
Поскольку алгоритм фактически не шифрует строки, а байты, а вывод алгоритма шифрования также является байтом [], почему бы не сохранить зашифрованные данные непосредственно в двоичном столбце?
Для MariaDB/MySql это было бы как BLOB
. Я понимаю, что PostgreSQL даже имеет предпочтительный специальный тип данных для зашифрованных данных, который называетсяbytea
.
Однако большинство программистов, похоже, вместо этого кодируют зашифрованные байты как Base64 и сохраняют полученную строку в VARCHAR
.
Кодирование и декодирование из Base64 кажется мне противоречащим интуиции. Это увеличивает длину данных до 50% и каждый раз становится дополнительным шагом. Он также заставляет базу данных применять кодировку символов при сохранении и извлечении данных. Это дополнительный шаг, который, безусловно, требует дополнительного времени и ресурсов, в то время как все, что нам действительно нужно хранить, - это несколько байтов. Зашифрованные данные не имеют смысла ни в какой кодировке символов.
Вопрос:
Есть ли веская причина для или против хранения зашифрованных данных в виде двоичного кода в базе данных? Есть ли причина безопасности, целостности данных или производительности, по которой я могу не захотеть хранить зашифрованные данные напрямую как двоичные?
1 ответ
(Я предполагаю, что этот вопрос скоро будет закрыт как "основанный на мнении", но тем не менее)
Есть ли веская причина для или против хранения зашифрованных данных в виде двоичного кода в базе данных?
Нет. Я не вижу причин против использования правильного типа "blob" (BLOB
, bytea
, varbinary(max)
,....)
Общее практическое правило: используйте тип данных, соответствующий данным. ТакBLOB
(или аналогичный тип) - правильный выбор.
Использование строк в кодировке base64 может быть оправдано тем, что не все библиотеки (уровни обфускации, такие как ORM) могут правильно работать с "блобами", поэтому люди решили использовать что-то универсально применимое (игнорируя накладные расходы на хранение и обработку).
Обратите внимание, что Postgres' bytea
не является "особым типом зашифрованных данных". Это тип данных общего назначения для двоичных данных (изображения, документы, музыка,...)