#vb.net #pdf #encryption #itext
#vb.net #PDF #шифрование #itext
Вопрос:
Я пытаюсь использовать метод itextsharp writer.setEncryption, в котором нет ничего для шифрования файла без пароля, но он устанавливает пароль для некоторого случайного PDF-файла, даже если я ничего не передавал для его шифрования.
pdf.SetEncryption(Nothing, Nothing, PdfWriter.AllowScreenReaders, PdfWriter.STRENGTH40BITS)
Ответ №1:
Оно работает должным образом.
Пожалуйста, ознакомьтесь с документацией метода, который вы использовали:
/** Sets the encryption options for this document. The userPassword and the
* ownerPassword can be null or have zero length. In this case the ownerPassword
* is replaced by a random string. The open permissions for the document can be
* AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
* AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
* The permissions can be combined by ORing them.
* @param userPassword the user password. Can be null or empty
* @param ownerPassword the owner password. Can be null or empty
* @param permissions the user permissions
* @param strength128Bits <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length
* @throws DocumentException if the document is already open
*/
virtual public void SetEncryption(byte[] userPassword, byte[] ownerPassword, int permissions, bool strength128Bits)
Итак, если вы не указываете значение для пароля владельца, документированное поведение заключается в том, что используется случайная строка, точно так, как вы наблюдали.
Очевидно, вы пытаетесь установить разрешения только для PDF PdfWriter.AllowScreenReaders
, но установка этого разрешения возможна только для зашифрованных файлов, а для шифрования требуется непустой пароль владельца, поэтому iText выбирает его за вас.
С другой стороны, возможен пустой пароль пользователя, поскольку в ходе его использования во время шифрования и дешифрования к значению пароля пользователя в любом случае добавляется «строка пароля по умолчанию».
Добавление
В ответ на вопросы в комментариях…
Что именно означает «заменяется случайной строкой»? И в каком формате будет этот пароль?
if (ownerPassword == null || ownerPassword.Length == 0)
ownerPassword = DigestAlgorithms.Digest("MD5", CreateDocumentId());
( PdfEncryption
метод SetupAllKeys
)
где CreateDocumentId
определяется следующим образом:
public static byte[] CreateDocumentId() {
long time = DateTime.Now.Ticks Environment.TickCount;
long mem = GC.GetTotalMemory(false);
String s = time " " mem " " (seq );
byte[] b = Encoding.ASCII.GetBytes(s);
return DigestAlgorithms.Digest("MD5", b);
}
Вы все еще можете как-то восстановить пароль?
Пароль явно нигде не сохраняется для последующего извлечения. В этой ситуации, т.е. при вызове шифрования с использованием пустого пароля владельца, предполагается, что вызывающий абонент не заинтересован в знании пароля.
Если это звучит странно для вас, пожалуйста, имейте в виду, что для фактического шифрования данных документа используется пароль пользователя, а не пароль владельца. (Точнее, значение, полученное из пароля пользователя.) Пароль владельца при шифровании документа используется только для шифрования пароля пользователя (точнее, производного от него значения) и сохранения этого значения в PDF.
Когда PDF открывается снова и пользователь вводит пароль, проверяется, можно ли его немедленно использовать для расшифровки данных документа (т. Е. это пароль пользователя) или его можно использовать для расшифровки вышеупомянутого значения пароля пользователя, который затем может расшифровать документ (т. Е. это пароль владельца).
В любом случае у пользователя есть доступ к PDF, но если это был только пароль пользователя, а не пароль владельца, ожидается, что обработчик PDF ограничит разрешенные операции в соответствии с заданным значением разрешений.
Таким образом, вызывающий абонент, не сообщающий пароль владельца, интерпретируется как не заинтересованный в том, чтобы кто-либо имел полный доступ к PDF в соответствующем спецификации процессоре PDF, для ограниченного доступа достаточно пароля пользователя. Это не имеет ничего общего с тем, что документ не поддается расшифровке из-за утери пароля…
Будет ли он использовать один из указанных ключевых преимуществ?
Что ж, MD5 возвращает 128-битный хэш, но поскольку структура хэшированных данных хорошо известна, пароль далеко не так надежен, как действительно случайное значение 128 bis. С другой стороны, строка из восьми символов обычно также далеко не так надежна, как эта…
Комментарии:
1. Что именно означает «заменяется случайной строкой»? Вы все еще можете как-то восстановить пароль? И в каком формате будет этот пароль? Будет ли он использовать один из указанных ключевых преимуществ? Я согласен, что документация отвечает на вопрос, но документация не кажется полной. (если вы находите этот комментарий слишком обширным, я, конечно, с удовольствием скопирую его в новый вопрос).
2. @Maarten Я добавил несколько ответов на ваши вопросы. Если вы ищете более конкретные детали, они, вероятно, действительно должны быть рассмотрены в отдельном специальном вопросе.
3. @mkl OkI понял вашу точку зрения, но дело в том, что это происходит только в одном документе, на данный момент другие документы обрабатываются очень хорошим способом
4. Тогда вам, вероятно, следует пояснить, что вы имеете в виду. Вы используете шифрование на основе паролей (
pdf.SetEncryption(string, string, ...)
. Таким образом, вы никогда не «шифруете файл без пароля» , как вы говорите. Поэтому, пожалуйста, уточните. Кроме того, если проблема возникает только с одним документом, вам следует предоставить доступ к этому документу для анализа, потому что в нем, по-видимому, есть что-то любопытное.5. @mkl Извините, я не могу поделиться этим документом, поскольку это конфиденциальный документ, но у меня был код, подобный pdf.setEncryption (Ничего, Nothing, …), поэтому он не должен устанавливать пароль.