pyPdf для извлечения IndirectObject

Эмитент и серийный номер контролируются злоумышленником, поэтому они не подходят для проверки.

Отпечаток пальца - это SHA1 множества свойств сертификата , включая эмитента, серийный номер, открытый ключ. Это, вероятно, пока нормально, и не может быть изменено .NET, потому что это функция Windows, но отпечатки пальцев предназначены для справки, а не безопасности.

Лучшим подходом было бы сравнить подпись сертификата и хеш-код и установить минимальное качество для хеш-кода SHA256 или выше. cert.SignatureAlgorithm.Value; выдаст вам алгоритм в виде OID, затем вы можете добавить к нему System.Security.Cryptography.Oid и использовать свойство FriendlyName, чтобы получить алгоритм в тексте, но получение реальной подписи не поддерживается, Вы должны восстановить третьим лицам, как BouncyCastle. Так что это, вероятно, не так, потому что кажется глупым принимать зависимость для этого.

На самом деле все сводится к тому, как вы регистрируете клиентские сертификаты. Я хотел бы попросить сертификаты (или где-нибудь выполнить процедуру регистрации, например, скажем, nuget имеет для подписи сертификатов), поместить их в класс X509Certificate2, затем создать хэш SHA256 свойства RawData и добавить его в свой список разрешений. Затем сделайте то же самое для входящих клиентских сертификатов и сравните SHA256 необработанных данных из входящего сертификата с разрешенным списком. Конечно, теперь вы должны справиться с истечением срока действия сертификата ...

10
задан Justin 20 August 2012 в 22:54
поделиться

3 ответа

каждый элемент в pdf.pages словарь, так предположение, что это находится на странице 1, pdf.pages[0]['/MYOBJECT'] должен быть элемент, который Вы хотите.

Можно попытаться распечатать это индивидуально или ввести по абсолютному адресу в нем с help и dir в подсказке Python для больше о том, как получить строку, которую Вы хотите

Править:

после получения копии PDF я нашел объект в pdf.resolvedObjects[0][558]['/Resources']['/Properties']['/MC0']['/MYOBJECT'] и значение может быть получено через getData ()

следующая функция уступает более универсальному дорогу для решения этого путем рекурсивного поиска рассматриваемого ключа

import types
import pyPdf
pdf = pyPdf.PdfFileReader(open('file.pdf'))
pages = list(pdf.pages)

def findInDict(needle,haystack):
    for key in haystack.keys():
        try:
            value = haystack[key]
        except:
            continue
        if key == needle:
            return value
        if type(value) == types.DictType or isinstance(value,pyPdf.generic.DictionaryObject):  
            x = findInDict(needle,value)
            if x is not None:
                return x

answer = findInDict('/MYOBJECT',pdf.resolvedObjects).getData()
8
ответ дан 3 December 2019 в 23:15
поделиться

IndirectObject обращается к фактическому объекту (он похож на ссылку или псевдоним так, чтобы общий размер PDF мог быть уменьшен, когда то же содержание появляется в нескольких местах). getObject метод даст Вам фактический объект.

Если объект является текстовым объектом, то просто выполнение ул. () или unicode () на объекте должно получить Вас данные в нем.

С другой стороны, pyPdf хранит объекты в атрибуте resolvedObjects. Например, PDF, который содержит этот объект:

13 0 obj
<< /Type /Catalog /Pages 3 0 R >>
endobj

Может быть считан с этим:

>>> import pyPdf
>>> pdf = pyPdf.PdfFileReader(open("pdffile.pdf"))
>>> pages = list(pdf.pages)
>>> pdf.resolvedObjects
{0: {2: {'/Parent': IndirectObject(3, 0), '/Contents': IndirectObject(4, 0), '/Type': '/Page', '/Resources': IndirectObject(6, 0), '/MediaBox': [0, 0, 595.2756, 841.8898]}, 3: {'/Kids': [IndirectObject(2, 0)], '/Count': 1, '/Type': '/Pages', '/MediaBox': [0, 0, 595.2756, 841.8898]}, 4: {'/Filter': '/FlateDecode'}, 5: 147, 6: {'/ColorSpace': {'/Cs1': IndirectObject(7, 0)}, '/ExtGState': {'/Gs2': IndirectObject(9, 0), '/Gs1': IndirectObject(10, 0)}, '/ProcSet': ['/PDF', '/Text'], '/Font': {'/F1.0': IndirectObject(8, 0)}}, 13: {'/Type': '/Catalog', '/Pages': IndirectObject(3, 0)}}}
>>> pdf.resolvedObjects[0][13]
{'/Type': '/Catalog', '/Pages': IndirectObject(3, 0)}
4
ответ дан 3 December 2019 в 23:15
поделиться

Метод Jehiah хорош при искании везде объекта. Мое предположение (смотрящий на PDF) - то, что это всегда находится в том же месте (первая страница в свойстве 'MC0'), и таким образом, намного более простой метод нахождения строки был бы:

import pyPdf
pdf = pyPdf.PdfFileReader(open("file.pdf"))
pdf.getPage(0)['/Resources']['/Properties']['/MC0']['/MYOBJECT'].getData()
2
ответ дан 3 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: