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

OpenSSL签名验证报错:输入数据过长无法作为哈希值求助

OpenSSL EC签名验证报错解决思路

问题重现

执行以下批处理脚本进行EC密钥生成、哈希计算、签名及验证时,始终报错OPENSSL Error: The input data looks too long to be a hash:

clear
Echo "Generate EC KeyPair from OpenSSL command line"
Echo "1. Create the EC key:"
  openssl ecparam -genkey -name prime192v1 > key.pem 
Echo "`n2.Set it to ANSI Encoding now"
cmd /c pause

Echo "`n3. Extract the public key:"
  openssl ec -in key.pem -pubout > pub.pem
cmd /c pause
Echo "`n4. Calculate the hash:"
  openssl dgst -sha256 -binary random.bin > hash.txt
cmd /c pause
Echo "`n5. Sign the hash with the private key:"
  openssl pkeyutl -sign -inkey key.pem -in hash.txt > sig.txt
cmd /c pause
Echo "`n6. Verify the signature with the public key:"
  openssl pkeyutl -verify -in hash.txt -sigfile sig.txt -inkey key.pem
Echo "`n"type here

使用版本:OpenSSL 1.1.1k 25 Mar 2021

错误原因

  1. 签名步骤重复哈希:pkeyutl -sign默认会对输入数据执行哈希运算,但你已经提前计算了SHA256哈希并写入hash.txt,导致OpenSSL尝试对32字节的哈希值再做一次SHA256哈希,最终数据长度与prime192v1密钥对应的24字节长度不匹配,触发报错。
  2. 验证步骤错误使用私钥:验证签名必须使用公钥pub.pem而非私钥key.pem,同时该步骤也存在重复哈希的问题。

修正后的操作步骤

方法一:直接对原始文件签名(推荐)

跳过手动计算哈希的步骤,让OpenSSL自动完成哈希+签名流程:

# 1. 生成EC密钥对
openssl ecparam -genkey -name prime192v1 > key.pem

# 2. 提取公钥
openssl ec -in key.pem -pubout > pub.pem

# 3. 直接对原始文件签名(自动执行SHA256哈希)
openssl pkeyutl -sign -inkey key.pem -in random.bin -out sig.txt -digest sha256

# 4. 验证签名(使用公钥,自动执行SHA256哈希)
openssl pkeyutl -verify -in random.bin -sigfile sig.txt -inkey pub.pem -pubin -digest sha256

方法二:保留手动哈希的步骤

如果必须手动计算哈希,需添加-rawin参数告知OpenSSL输入是原始哈希值,无需再执行哈希运算:

# 1. 生成EC密钥对
openssl ecparam -genkey -name prime192v1 > key.pem

# 2. 提取公钥
openssl ec -in key.pem -pubout > pub.pem

# 3. 计算SHA256哈希(二进制格式)
openssl dgst -sha256 -binary random.bin > hash.txt

# 4. 对原始哈希签名(-rawin指定输入为原始哈希)
openssl pkeyutl -sign -inkey key.pem -in hash.txt -out sig.txt -rawin

# 5. 验证签名(使用公钥,-rawin指定输入为原始哈希)
openssl pkeyutl -verify -in hash.txt -sigfile sig.txt -inkey pub.pem -pubin -rawin

关键参数说明

  • -digest sha256:指定签名/验证时使用的哈希算法,仅直接处理原始文件时需要。
  • -rawin:告知OpenSSL输入是原始哈希值,无需再执行哈希运算。
  • -pubin:指定验证时使用的是公钥文件,而非私钥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:02:24