Это - это , работающее должным образом.
Пожалуйста, ознакомьтесь с документацией используемого вами метода:
/** 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
method 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 бис.С другой стороны, строка из восьми символов обычно также не так сильна, как эта ...