Как снять пароль с листа Excel

Защита листа в Excel спасает только от случайных изменений и от совсем уж неопытных пользователей. В статье продемонстрирован простейший способ редактирования защищённого листа, не требующий специальных знаний и установки дополнительных программ. После редактирования тот же самый пароль можно вернуть обратно.

  1. Меняем расширение файла с .xlsx (.xls) на .zip, получаем архив.
  2. Открываем архив.

    Возможный альтернативный вариант - "Открыть с помощью" -> архиватор. У меня файл .xlsx открылся в 7zip (можно скачать с их оф. сайта) как архив и без смены расширения.


  3. В архиве открываем папки xl -> worksheets и находим файл с тем же названием, что и нужный нам заблокированный лист (в моём примере - "sheet1.xml")
  4. Достаём этот файл из архива и открываем в текстовом редакторе (можно в блокноте. Я предпочитаю 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>​
  5. Сразу после </sheetData> видим часть, которая отвечает за защиту листа. В новом экселе используется алгоритм хеширования SHA-512. В файле есть хеш пароля и соль. Пароль мы по хешу узнать не сможем, но это не помешает нам редактировать лист и вернуть тот же самый пароль обратно.
    Для любопытных:
    • Также в этой части xml файла прописывается, что именно защищено паролем (объекты, лист, форматирование и т.д.). 
    • Как это работает в Excel: программа пытается лист в файле и спрашивает пароль -> Пользователь вводит пароль -> Программа считает hashvalue, используя предложенный пользователем пароль-> Если hashvalue совпал с тем, что прописан в файле листа, то программа открывает лист.
    • Почему это так легко сломать: Кроме пароля, всё остальное находится в файле Excel в незашифрованном виде и ничего не мешает пользователю на время вырезать пароль прям из xml файла, в котором он прописан. Excel пропажи не заметит (естественно, если там стоит один лишь пароль листа). Логичнее было бы шифровать весь лист, но в microsoft решили так не делать (возможно в числе прочего из-за того, что текст ячеек всех листов хранится централизованно в другом .xml файле).
    • Подобрать пароль теоретически всё-таки можно, но это будет крайне ресурсоёмко. Хеш - односторонняя трансформация. Единственный способ узнать исходную последовательность - грубый перебор всех вариантов пароля и расчёт хеша для каждого из них. У данного метода есть варианты взлома по словарю или перебору по предварительно рассчитанным "радужным таблицам" - отсортированным хешам, но сути этого не меняет. Кроме того, этот самый хеш в экселе не только зависит от пароля, но и завязан на какие-то внутренние параметры книги, соответственно не может существовать общей базы хешей для перебора для любого файла эксель, что оставляет нам только самый медленный и примитивный вариант брутфорса (перебора) и пересчёта всех паролей по одному. Если пароль сложный, то хеш взломать за конечное время практически невозможно. Дождитесь появления в продаже квантовых компьютеров :)
  6. Сохраняем хеш старого пароля (лучше сразу весь блок <sheetProtection.... > в отдельном файле (это нам потом пригодится, если вам понадобится поставить тот же самый пароль)
  7. Удаляем <sheetProtection.... > из файла, который мы достали из архива, сохраняем, закидываем обратно туда же, откуда мы его взяли. В данном случае я удалил весь этот блок:
    <sheetProtection algorithmName="SHA-512" hashValue="/6tqbVAZ+w0kBBfi5B+TxW2Z0Xv1yscwe3Ft1blkDcBQDykqPfbzxnEEo9m2kDVZSjH7DEtjilkLPTfK60svAw==" 
    	saltValue="JNZfptButvjxgef/KhKkNg==" spinCount="100000" sheet="1" objects="1" scenarios="1"/>​
  8. Меняем расширение файла обратно на .xlsx и открываем в Excel. Лист можно редактировать, пароля не будет.
  9. Если нужно вернуть тот же самый пароль (мы его не знаем), то ставим свой произвольный пароль на тот же самый лист, сохраняем, закрываем Excel.
  10. Повторяем процедуру - смена расширения на .zip, xl -> worksheets, достаём тот же самый ИмяЛиста.xml
  11. Открываем этот xml файл и заменяем "hashvalue=".... и saltValue="..." на те, которые мы сохранили в другом месте на шаге 6 (либо весь блок <sheetProtection.... >).

Вывод: Пароль листа в текущей его реализации в Excel снимается и устанавливается обратно за 3-4 минуты. Установку пароля для листа можно использовать только для защиты от случайных изменений. При этом поле пароля можно оставить пустым, просто нажав Ok: