Pergunta

Preciso adicionar proteção básica de senha a um documento aberto do XML WordProcessing. Eu posso usar a interface com, que é muito lento quando tenho um grande número de documentos para processar; ou posso colocar os dados diretamente no arquivo docx em <w:settings> <w:documentProtection> o que é muito rápido. No entanto, analisar os requisitos para criptografar a senha parece que levará horas de programação. Alguém já tem esse algoritmo já codificado? Estou codificando em C#.

Foi útil?

Solução 2

Eu tinha algo semelhante ao @Brij e esperava obter o algoritmo para o hash de senha. Posteriormente, encontrei algum código incompleto no fórum MSDN e também descobri que a proteção de senha do Word 2007 é facilmente contornada. Então, por enquanto, estou apenas colocando um hash e sal aleatório, para que ninguém, inclusive eu, saiba a senha real. Isso é um esforço suficiente para evitar mudanças acidentais; E, como é impossível evitar mudanças intencionais, não vou torná -lo mais seguro.

Outras dicas

Aqui está um trecho de código completo. Ele fornece um utilitário de linha de comando para bloquear e desbloquear arquivos do Word (desbloqueando o arquivo - eu acho - também remove a proteção de senha, embora eu não tenha tentado isso).

Você precisa do OpenXML Format SDK 2.0 para executar isso, disponível aqui: http://www.microsoft.com/downloads/details.aspx?familyid=c6e744e5-36e9-45f5-8d8c-331df206e0d0&displaylang=en, e uma referência ao documentFormat.openxml em seu projeto.

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();
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top