Защита листа в Excel спасает только от случайных изменений и от совсем уж неопытных пользователей. В статье продемонстрирован простейший способ редактирования защищённого листа, не требующий специальных знаний и установки дополнительных программ. После редактирования тот же самый пароль можно вернуть обратно.
- Меняем расширение файла с .xlsx (.xls) на .zip, получаем архив.
- Открываем архив.
Возможный альтернативный вариант - "Открыть с помощью" -> архиватор. У меня файл .xlsx открылся в 7zip (можно скачать с их оф. сайта) как архив и без смены расширения. - В архиве открываем папки xl -> worksheets и находим файл с тем же названием, что и нужный нам заблокированный лист (в моём примере - "sheet1.xml")
- Достаём этот файл из архива и открываем в текстовом редакторе (можно в блокноте. Я предпочитаю Sublime text (можно бесплатно скачать с их оф. сайта), потому что в нём подсвечивается синтаксис). Далее мы видим нечто подобное:
Для наглядности я представлю это в читаемом виде (это делать не обязательно :) ):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac xr xr2 xr3" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr2="http://schemas.microsoft.com/office/spreadsheetml/2015/revision2" xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" xr:uid="{00000000-0001-0000-0000-000000000000}"> <dimension ref="A1:B3"/> <sheetViews> <sheetView tabSelected="1" workbookViewId="0"> <selection activeCell="D5" sqref="D5"/> </sheetView> </sheetViews> <sheetFormatPr defaultRowHeight="14.4" x14ac:dyDescent="0.3"/> <cols> <col min="1" max="2" width="15.44140625" bestFit="1" customWidth="1"/> </cols> <sheetData> <row r="1" spans="1:2" ht="67.2" customHeight="1" x14ac:dyDescent="0.3"> <c r="A1" t="s"><v>0</v></c><c r="B1" t="s"><v>3</v></c> </row> <row r="2" spans="1:2" x14ac:dyDescent="0.3"> <c r="A2" t="s"><v>1</v></c><c r="B2" t="s"><v>4</v></c> </row> <row r="3" spans="1:2" x14ac:dyDescent="0.3"> <c r="A3" s="1" t="s"><v>2</v></c><c r="B3" s="1"/> </row> </sheetData> <sheetProtection algorithmName="SHA-512" hashValue="/6tqbVAZ+w0kBBfi5B+TxW2Z0Xv1yscwe3Ft1blkDcBQDykqPfbzxnEEo9m2kDVZSjH7DEtjilkLPTfK60svAw==" saltValue="JNZfptButvjxgef/KhKkNg==" spinCount="100000" sheet="1" objects="1" scenarios="1"/> <mergeCells count="1"> <mergeCell ref="A3:B3"/> </mergeCells> <phoneticPr fontId="1" type="noConversion"/><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/></worksheet>
- Сразу после </sheetData> видим часть, которая отвечает за защиту листа. В новом экселе используется алгоритм хеширования SHA-512. В файле есть хеш пароля и соль. Пароль мы по хешу узнать не сможем, но это не помешает нам редактировать лист и вернуть тот же самый пароль обратно.
Для любопытных:
- Также в этой части xml файла прописывается, что именно защищено паролем (объекты, лист, форматирование и т.д.).
- Как это работает в Excel: программа пытается лист в файле и спрашивает пароль -> Пользователь вводит пароль -> Программа считает hashvalue, используя предложенный пользователем пароль-> Если hashvalue совпал с тем, что прописан в файле листа, то программа открывает лист.
- Почему это так легко сломать: Кроме пароля, всё остальное находится в файле Excel в незашифрованном виде и ничего не мешает пользователю на время вырезать пароль прям из xml файла, в котором он прописан. Excel пропажи не заметит (естественно, если там стоит один лишь пароль листа). Логичнее было бы шифровать весь лист, но в microsoft решили так не делать (возможно в числе прочего из-за того, что текст ячеек всех листов хранится централизованно в другом .xml файле).
- Подобрать пароль теоретически всё-таки можно, но это будет крайне ресурсоёмко. Хеш - односторонняя трансформация. Единственный способ узнать исходную последовательность - грубый перебор всех вариантов пароля и расчёт хеша для каждого из них. У данного метода есть варианты взлома по словарю или перебору по предварительно рассчитанным "радужным таблицам" - отсортированным хешам, но сути этого не меняет. Кроме того, этот самый хеш в экселе не только зависит от пароля, но и завязан на какие-то внутренние параметры книги, соответственно не может существовать общей базы хешей для перебора для любого файла эксель, что оставляет нам только самый медленный и примитивный вариант брутфорса (перебора) и пересчёта всех паролей по одному. Если пароль сложный, то хеш взломать за конечное время практически невозможно. Дождитесь появления в продаже квантовых компьютеров :)
- Сохраняем хеш старого пароля (лучше сразу весь блок <sheetProtection.... > в отдельном файле (это нам потом пригодится, если вам понадобится поставить тот же самый пароль)
- Удаляем <sheetProtection.... > из файла, который мы достали из архива, сохраняем, закидываем обратно туда же, откуда мы его взяли. В данном случае я удалил весь этот блок:
<sheetProtection algorithmName="SHA-512" hashValue="/6tqbVAZ+w0kBBfi5B+TxW2Z0Xv1yscwe3Ft1blkDcBQDykqPfbzxnEEo9m2kDVZSjH7DEtjilkLPTfK60svAw==" saltValue="JNZfptButvjxgef/KhKkNg==" spinCount="100000" sheet="1" objects="1" scenarios="1"/>
- Меняем расширение файла обратно на .xlsx и открываем в Excel. Лист можно редактировать, пароля не будет.
- Если нужно вернуть тот же самый пароль (мы его не знаем), то ставим свой произвольный пароль на тот же самый лист, сохраняем, закрываем Excel.
- Повторяем процедуру - смена расширения на .zip, xl -> worksheets, достаём тот же самый ИмяЛиста.xml
- Открываем этот xml файл и заменяем "hashvalue=".... и saltValue="..." на те, которые мы сохранили в другом месте на шаге 6 (либо весь блок <sheetProtection.... >).
Вывод: Пароль листа в текущей его реализации в Excel снимается и устанавливается обратно за 3-4 минуты. Установку пароля для листа можно использовать только для защиты от случайных изменений. При этом поле пароля можно оставить пустым, просто нажав Ok: