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

Apple CryptoKit生成的P256 DER签名无法被OpenSSL验证如何解决

问题原因
  • Apple CryptoKit 中 P256.Signing.PrivateKey.signature(for:) 方法的默认逻辑是:自动对输入的原始消息计算SHA-256哈希,再对哈希结果生成ECDSA签名,不需要开发者手动做哈希处理。
  • Ruby OpenSSL封装的dsa_verify_asn1方法,要求传入的第一个参数是已经完成哈希计算的摘要值,不会自动对输入的原始消息做哈希处理。直接传入原始消息字符串相当于用错误的内容做验证,自然返回false。
解决方案

修改Ruby代码,先对原始消息计算SHA256哈希,再用哈希结果做签名验证,修改后的代码如下:

require 'openssl'
require 'base64'
require 'digest'

group = OpenSSL::PKey::EC::Group.new('prime256v1')
key = OpenSSL::PKey::EC.new(group)

public_key_hex = '043fbd15edf44c644e2cdaba55db35170521e5c4bd09156b4930cc5721d64be694191e32f33b7a0b583ca301bd76fb2f93df774eddac72add74ef938d236ad1673'
public_key_bn = OpenSSL::BN.new(public_key_hex, 16)
public_key = OpenSSL::PKey::EC::Point.new(group, public_key_bn)    
key.public_key = public_key

data = 'A message to sign'
# 对原始消息计算SHA256哈希
digest = Digest::SHA256.digest(data)
signature_base64 = 'MEUCIA3tBd5hwGLpuMWjr5sYzbBb2NGVl0lIacFQ0A9JCjowAiEAzxyjxqnIwfX7MujRARefZMSfnWnTBD3NI3H/+aXddLM='
signature = Base64.decode64(signature_base64)
# 传入哈希摘要而不是原始消息
puts key.dsa_verify_asn1(digest, signature)

修改后运行代码即可返回true,验证通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:15:01