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

Python下RSA签名验证异常:篡改文本文件后仍验证通过

排查RSA签名验证失效的常见问题

Hey,我之前也踩过一模一样的坑——篡改文件后验证居然还能通过,当时头都大了!咱们一步步来排查最可能的几个原因,应该能找到问题所在:

  • 你签名的根本不是文件内容!
    这是最常见的错误:比如误把文件名、文件对象或者空字符串当成了文件内容签名,或者读取文件时只读了一部分(比如代码里漏了f.read())。检查你的签名代码:

    # 错误示例:签了文件名而不是文件内容
    with open("test.txt", "r") as f:
        data = "test.txt"  # 这里必须改成 data = f.read()
    signature = rsa.sign(data, private_key, "SHA-256")
    

    一定要确保你签名的是从文件里读取到的完整内容,最好用二进制模式读取("rb"),避免编码问题。

  • 签名和验证用的哈希算法不匹配
    RSA签名必须指定哈希算法(比如SHA-256、SHA-1),如果签名时用的是SHA-256,但验证时用了SHA-1(或者没显式指定导致默认算法不一致),就会出现验证失效的情况。两边的算法必须完全一致:

    # 签名时明确指定算法
    rsa.sign(data, private_key, "SHA-256")
    # 验证时必须用同一个算法
    rsa.verify(data, signature, public_key, "SHA-256")
    

    注意:部分版本的rsa库在verify时如果不指定算法,会默认用旧的SHA-1,一定要显式写清楚。

  • 文件读取的编码/模式不一致
    比如签名时用"utf-8"编码读取文件,验证时却用了系统默认编码(比如Windows下的GBK),或者一边用文本模式、一边用二进制模式,会导致读取到的内容哈希值完全不同。如果你的验证逻辑又不小心用了签名时的旧数据,就会误判为通过。
    最稳妥的方式是两边都用二进制模式读取文件:

    # 签名和验证都用rb模式读取字节流
    with open("test.txt", "rb") as f:
        data = f.read()
    
  • 验证时没读取篡改后的最新文件
    比如验证代码里缓存了之前的文件数据,或者读取的是备份文件而不是被篡改的目标文件。每次验证前都要重新读取文件内容,别用之前保存的变量!

  • 密钥对不匹配或者有问题
    比如你用A私钥签的名,却用B公钥验证,或者生成密钥时出了错。先做个基础测试:用你的私钥签名一段随机字符串,再用公钥验证,如果这个小测试都通不过,说明密钥对本身有问题。

  • 签名的保存/传递出了问题
    比如签名是二进制数据,你却直接转成字符串保存(导致字节丢失),或者传递时用了错误的编码。正确的做法是用二进制模式保存签名:

    # 保存签名
    with open("signature.bin", "wb") as f:
        f.write(signature)
    # 验证时读取签名
    with open("signature.bin", "rb") as f:
        signature = f.read()
    

    如果需要用文本格式传递,可以用base64编码,验证时再解码回来。

你可以先从这几个点入手排查,尤其是前三个,大概率能找到问题。如果还是不行,把你的签名和验证核心代码贴出来,咱们再一起揪出bug!

内容的提问来源于stack exchange,提问作者Hero31

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:09:26