使用python进行时间戳查询

时间:2015-02-04 09:03:33

标签: python openssl timestamp trusted-timestamp

我想使用命令:

创建一个像openssl这样的.tsq文件

openssl ts -query -data <file> -no_nonce -sha512 -out <out.tsq>

我想用python实现这个,任何人都知道如何做这个,任何模块或类似的东西?

3 个答案:

答案 0 :(得分:2)

现在我可以想到三种不同的方法:

  1. 使用一些未知质量的预制python模块,如@ J.F.Sebastian在评论中提到的python-rfc3161
  2. 使用hashlib module计算要加时间戳的数据的SHA512哈希值,然后使用pyasn1 module构建和编码RFC3161中定义的TimeStampReq请求结构。
  3. 使用hashlib module计算要为其加时间戳的数据的SHA512哈希,并将这些字节0x30 0x56 0x02 0x01 0x01 0x30 0x51 0x30 0x0D 0x06 0x09 0x60 0x86 0x48 0x01 0x65 0x03 0x04 0x02 0x03 0x05 0x00 0x04 0x40预先挂起到哈希值。这应该对您有用,因为您提供的OpenSSL命令正在创建不包含任何变量部分的TS请求(例如nonce或策略OID),因此无论您将使用什么输入数据,请求结构的第一部分都不会更改。

答案 1 :(得分:1)

这是来自@jariq's answer的第三个想法的Python 3实现:

#!/usr/bin/env python3
"""Emulate `openssl ts -query -data <file> -no_nonce -sha512 -out <out.tsq>`

   Usage: %(prog)s <file> [<out.tsq>]

If <out.tsq> is not given; use <file> name and append '.tsq' suffix
"""
import hashlib
import sys
from functools import partial

def hash_file(filename, hashtype, chunksize=2**15, bufsize=-1):
    h = hashtype()
    with open(filename, 'rb', bufsize) as file:
        for chunk in iter(partial(file.read, chunksize), b''):
            h.update(chunk)
    return h

try: # parse command-line arguments
    filename, *out_filename = sys.argv[1:]
    out_filename.append(filename + '.tsq')
except ValueError:
    sys.exit(__doc__ % dict(prog=sys.argv[0]))

h = hash_file(filename, hashlib.sha512) # find hash of the input file
with open(out_filename[0], 'wb') as file: # write timestamp query
    file.write(b'0V\x02\x01\x010Q0\r\x06\t`\x86H\x01'
               b'e\x03\x04\x02\x03\x05\x00\x04@')
    file.write(h.digest())

答案 2 :(得分:0)

要扩展@j-f-sebastian's answer,如果要使用sha-256(或任何256位散列函数)进行散列,请使用以下常量:

b'06\x02\x01\x01010\r\x06\t`\x86H\x01e\x03\x04\x02\x01\x05\x00\x04 '

(是的,最后一个字符是空格)