symnoob, Полные номера карт обычно хранят только платёжные сервисы, а они сертифицируются по PCI DSS в котором подробно расписано что и как хранить. Если вам надо писать сервис который будет сертифицироваться по PCI DSS - то вопросы по нему лучше явно задавать не здесь, а читать соответствующие спецификации, если же нет - то вы не храните полные номера. Обычно это только последние 4 цифры или первые 4 и последние 4, а их можно и в открытом виде хранить.
В целом только номер карты (без остальной информации) не является приватным, уверен что вы сами сталкивались с сервисами "перевести по номеру карты", так что можно хранить и целиком, но если вам не надо с этой информацией работать - то лучше хранить только частичный номер.
Для привязки карт вы связываетесь с платёжным шлюзом, он выполняет привязку и хранит карту у себя, а вам отдаёт только токен. Хранить ли его в открытом виде - вопрос неоднозначный, можно и зашифровать чтобы при утечке базы их не могли быстро получить.
symnoob, Для шифрования начиная с 7.2 в стандартной поставке PHP идёт модуль sodium, являющийся обёрткой над криптографической библиотекой libsodium. Если вам нужен более высокоуровневый интерфейс - то обратите внимание на paragonie/halite, работающий всё с тем же sodium.
Однако ваше замечание о 256 битах, возможно, говорит о том что вам нужно хэширование, а не шифрование. Для этого в PHP есть встроенные функции.
symnoob, Да, правильно, для шифрования хэши не подходят, у них другая задача. Именно для шифрования необходимо использовать либо симметричное либо ассмметричное шифрование.