用于签名和验证warc文件的工具
warcsigner的Python项目详细描述
用于向WARC(或任何gzip分块)文件添加和验证加密签名的工具
这个包提供了completarywarc-sign工具,它用rsa签名和 warc-verify,用于验证WARC是否已签名
用法
安装时使用:python setup.py install
可以使用python setup.py test
运行测试签署warc:
warc-sign privatekey.pem my-warc-file.warc.gz
要验证warc是否已签名:
warc-verify publickey.pem my-warc-file.warc.gz
API使用
warcsigner可以从其他脚本中使用。 签署warc:
from warcsigner.warcsigner import RSASigner signer = RSASigner(private_key_file='privatekey.pem') if signer.sign('my-warc-file.warc.gz'): # warc signed successfully
或验证:
from warcsigner.warcsigner import RSASigner signer = RSASigner(public_key_file='publickey.pem') if signer.verify('my-warc-file.warc.gz'): # signature verified else: # signature not found/invalid
sign和verify方法可以采用文件名字符串或类似的文件 stream对象(具有read方法的对象)
此外,在验证后,可以删除签名:
if signer.verify('my-warc-file.warc.gz', remove=True): # signature verified and removed assert signer.verify('my-warc-file.warc.gz') == False
如果第一次验证成功,将删除签名并截断文件 其先前的预签名大小。(如果验证失败,则文件不变)。 如果计划附加到WARC,然后放弃它,这可能很有用
流媒体和seek()
可以使用支持read()而不是文件名的类文件对象。
当对WARC进行签名时,该签名将附加到文件的末尾
验证文件时,seek()可用于确定文件大小和签名位置。 但是,如果将size=param添加到verify或verify_stream调用中,则在 验证和类文件对象是线性使用的。这特别有用 从远程位置传输文件时,seek()不可用。 但必须提供总文件大小。
公钥/私钥应为.PEM格式 有关详细信息,请参见python-rsa formats doc 支持的密钥格式
原始流
在某些情况下,从有符号流返回原始的无符号流可能是有用的。 signer.get_unsigned_stream(stream, size)将返回流的包装器,该包装器不包括签名(如果存在)。如果在连接warc时不包括每个warc的签名(和空记录),这将非常有用。
工作原理
python-rsa库用于签名和验证签名
签名存储在一个额外的gzip块中,该块不包含数据,但使用custom extra field 保存签名。这允许验证工具通过检查距WARC末端的固定偏移量来快速访问签名
当解压缩gzip块时,应该没有可检测的差异,因为大多数gzip工具忽略了额外的gzip头。
虽然这是为压缩warc而设计的,但它可以用于任何由连接的gzip块、ARC文件等组成的格式
注意:由于签名是一个gzip块,所以对于未压缩/纯文本文件来说就没有意义了。