如何检查上传文件是否带签名及Base64转换后的验证流程
检查上传文件签名及Base64转换后的验证流程
一、直接检查上传文件的签名
上传文件的签名通常嵌入在格式约定的特定区域,检查流程如下:
- 提取原始二进制数据:从输入字段获取文件的原始字节流(优先直接处理二进制,避免Base64转换的额外开销)。
- 定位签名存储区域:根据文件格式规范找到签名位置:
- PDF文件的签名存放在
/Sig字典对应的对象中; - 遵循PKCS#7标准的文件(如带签名的Office文档),签名通常附在文件末尾或独立的签名段;
- 自定义格式文件,需提前约定签名的起始标记、偏移量或固定长度区域。
- PDF文件的签名存放在
- 验证签名有效性:
- 从签名区域提取签名值、原始数据的哈希摘要、签名者公钥证书;
- 用签名者公钥解密签名值,得到解密后的哈希值;
- 对文件原始内容(排除签名区域本身)重新计算相同算法的哈希值;
- 对比两个哈希值:完全匹配则签名合法且文件未被篡改,不匹配则签名无效或文件已修改。
二、Base64转换后的签名验证流程
若文件已转为Base64格式,需先还原为原始二进制再验证,步骤如下:
- Base64解码回二进制:用对应语言的解码工具(如Python的
base64.b64decode()、JavaScript的Buffer.from(base64Str, 'base64'))将Base64字符串还原为字节流,注意处理解码异常(如格式错误、填充字符缺失)。 - 执行文件签名检查流程:解码完成后,按照上述「直接检查上传文件的签名」的步骤2和3完成验证。
- 可选完整性校验:计算解码后文件的哈希值,与上传前原始文件的哈希值对比,确保Base64转换过程无数据损坏。
示例伪代码(Python)
import base64 from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding from cryptography.x509 import load_pem_x509_certificate # 假设已获取Base64字符串和签名者公钥证书PEM base64_file = "..." public_key_pem = "..." # 1. Base64解码 file_bytes = base64.b64decode(base64_file) # 2. 提取签名和原始数据(示例假设签名在文件末尾固定长度区域) signature_length = 256 signature = file_bytes[-signature_length:] original_data = file_bytes[:-signature_length] # 3. 加载公钥 cert = load_pem_x509_certificate(public_key_pem.encode()) public_key = cert.public_key() # 4. 验证签名 try: public_key.verify( signature, original_data, padding.PKCS1v15(), hashes.SHA256() ) print("签名验证通过") except: print("签名验证失败")
内容的提问来源于stack exchange,提问作者Marko Nikolic
相关产品推荐
相关产品推荐

