Шаги ==== Настроить MySQL и попробовать создать зашифрованный, а затем расшифровать бекап с неправильной длиной ключа (32, нужно 16): # LENGTH=32 && \ set -o pipefail && \ apt-get install -y percona-xtrabackup80 && \ rm -rvf /var/lib/mysql/ && apt-get install -y --reinstall MySQL perl-DBD-mysql && \ chkconfig mysqld on && \ systemctl enable --now mysqld ; sleep 2 ; systemctl status --no-pager mysqld && \ control mysqld-chroot disabled && systemctl restart mysqld ; sleep 2 ; systemctl status --no-pager mysqld && \ echo create database test | mysql && \ mkdir -p /data/backups && \ key="$(openssl rand -base64 -hex "$LENGTH")" && \ xtrabackup --backup --encrypt=AES256 --encrypt-key="${key}" --datadir=/var/lib/mysql/db --target-dir=/data/backups/encrypt; \ for i in $(find /data/backups/encrypt/ -iname "*\.xbcrypt"); do xbcrypt -d --encrypt-key="${key}" --encrypt-algo=AES256 < $i > $(dirname $i)/$(basename $i .xbcrypt) && rm -fv $i; done Фактический результат ===================== Создание резервной копии не успешное из-за неправильной длины ключа и программа выходит с 1, но не падает. > encryption: unable to set libgcrypt cipher key - User defined source 1 : Invalid key length А расшифровка ещё и падает на assert: > encryption: unable to set libgcrypt cipher key - User defined source 1 : Invalid key length > Assertion "0" failed at /usr/src/RPM/BUILD/percona-xtrabackup80-8.0.35/storage/innobase/xtrabackup/src/ds_decrypt.cc:48 > Аварийный останов Ожидаемый результат =================== Нет падения на assert. Воспроизводимость ================= Воспроизводится на виртуальных машинах: [sisyphus] ALT Server 11.0 beta20250213 x86_64 percona-xtrabackup80-8.0.35-alt5.x86_64 [p11] ALT Server 11.0 beta20250213 x86_64 percona-xtrabackup80-8.0.35-alt4.x86_64
Ошибка в тесте, в конструкции LENGTH=32 && key="$(openssl rand -base64 -hex "$LENGTH")" в переменной $key будет значение длинной 64 символа (то есть 512 бит, поэтому и сообщение о длине ключа). Если же в LENGTH указать 16, то значение будет 32 символа (256 бит) и приведенный выше скрипт отрабатывает успешно.
Да, ошибка сделана специально. Проблема в разнице поведение шифрования и дешифрования - при шифровании хоть и отображается та же ошибка (ожидаемо), программа не падает с аварийным остановом. Аварийный останов / assert предполагает ситуацию, которая не была предусмотрена в программе, но исходя из отображаемой ошибки, она предусмотрена - но код её обработки почему-то не выходит сразу из программы, поэтому позже и падает на assert.
(Ответ для Artem Varaksa на комментарий #2) > Да, ошибка сделана специально. Проблема в разнице поведение шифрования и > дешифрования - при шифровании хоть и отображается та же ошибка (ожидаемо), > программа не падает с аварийным остановом. > > Аварийный останов / assert предполагает ситуацию, которая не была > предусмотрена в программе, но исходя из отображаемой ошибки, она > предусмотрена - но код её обработки почему-то не выходит сразу из программы, > поэтому позже и падает на assert. Это ожидаемое поведение, заложенное разработчиками.