Защита паролем Open XML Wordprocessing Document - PullRequest
3 голосов
/ 11 ноября 2009

Мне нужно добавить базовую защиту паролем в документ Word XML для обработки документов. Я могу либо использовать интерфейс COM, который очень медленный, когда у меня есть большое количество документов для обработки; или я могу поместить данные непосредственно в файл docx в <w:settings> <w:documentProtection>, что очень быстро. Однако рассмотрение требований к шифрованию пароля выглядит так, как будто это займет несколько часов программирования. У кого-нибудь этот алгоритм уже закодирован? Я кодирую в C #.

Ответы [ 2 ]

5 голосов
/ 11 ноября 2009

вот полный фрагмент кода. Он дает вам утилиту командной строки для блокировки и разблокировки файлов Word (разблокировка файла, я думаю, также снимет защиту паролем, хотя я этого не пробовал).

Вам необходим OpenXML Format SDK 2.0 для запуска, доступный здесь: http://www.microsoft.com/downloads/details.aspx?FamilyId=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&displaylang=en, и ссылка на DocumentFormat.OpenXml в вашем проекте.

using System;
using System.Xml.Linq;

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

namespace LockDoc
{
    /// <summary>
    /// Manipulates modification permissions of an OpenXML document.
    /// </summary>
    class Program
    {
        /// <summary>
        /// Locks/Unlocks an OpenXML document.
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine("Usage: lockdoc lock|unlock filename.docx");
                return;
            }

            bool isLock = false;
            if (args[0].Equals("lock", StringComparison.OrdinalIgnoreCase))
            {
                isLock = true;
            }
            else if (!args[0].Equals("unlock", StringComparison.OrdinalIgnoreCase))
            {
                Console.Error.WriteLine("Wrong action!");
                return;
            }

            WordprocessingDocument doc = WordprocessingDocument.Open(args[1], true);
            doc.ExtendedFilePropertiesPart.Properties.DocumentSecurity =
                new DocumentFormat.OpenXml.ExtendedProperties.DocumentSecurity
                (isLock ? "8" : "0");
            doc.ExtendedFilePropertiesPart.Properties.Save();

            DocumentProtection dp =
                doc.MainDocumentPart.DocumentSettingsPart
                .Settings.ChildElements.First<DocumentProtection>();
            if (dp != null)
            {
                dp.Remove();
            }

            if (isLock)
            {
                dp = new DocumentProtection();
                dp.Edit = DocumentProtectionValues.Comments;
                dp.Enforcement = DocumentFormat.OpenXml.Wordprocessing.BooleanValues.One;

                doc.MainDocumentPart.DocumentSettingsPart.Settings.AppendChild(dp);
            }

            doc.MainDocumentPart.DocumentSettingsPart.Settings.Save();

            doc.Close();
        }
    }
}
2 голосов
/ 17 мая 2011

У меня было что-то похожее на @Brij, и я надеялся получить алгоритм для хэша пароля. Впоследствии я нашел неполный код на форуме MSDN, а также обнаружил, что защита паролем Word 2007 очень легко обойти. Так что сейчас я просто добавляю случайный хеш и соль, чтобы никто, включая меня, не знал действительный пароль. Этого достаточно, чтобы предотвратить случайные изменения; и учитывая невозможность предотвращения преднамеренных изменений, я не собираюсь делать это более безопасным.

...