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
相关产品推荐
相关产品推荐

