You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查上传文件是否带签名及Base64转换后的验证流程

检查上传文件签名及Base64转换后的验证流程

一、直接检查上传文件的签名

上传文件的签名通常嵌入在格式约定的特定区域,检查流程如下:

  • 提取原始二进制数据:从输入字段获取文件的原始字节流(优先直接处理二进制,避免Base64转换的额外开销)。
  • 定位签名存储区域:根据文件格式规范找到签名位置:
    • PDF文件的签名存放在/Sig字典对应的对象中;
    • 遵循PKCS#7标准的文件(如带签名的Office文档),签名通常附在文件末尾或独立的签名段;
    • 自定义格式文件,需提前约定签名的起始标记、偏移量或固定长度区域。
  • 验证签名有效性:
    1. 从签名区域提取签名值、原始数据的哈希摘要、签名者公钥证书;
    2. 用签名者公钥解密签名值,得到解密后的哈希值;
    3. 对文件原始内容(排除签名区域本身)重新计算相同算法的哈希值;
    4. 对比两个哈希值:完全匹配则签名合法且文件未被篡改,不匹配则签名无效或文件已修改。

二、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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:15:09