ruby-on-rails – 在给定私钥和消息的情况下,不确定如何生成ECDS
我正在关注
Apple’s guide撰写CloudKit Web服务请求.我遇到问题的是第2步,在“验证Web服务请求”下:
在开始这一点之前,我生成了我的证书,一个.pem文件,在文本编辑器中打开它时会显示我的私钥,所以我也用字符串格式. 我还遵循了生成它所引用的消息的步骤,我现在将其作为字符串. 因此,假设我有一个私钥(或者.pem文件,如果需要的话),以及一个消息作为字符串,理论上我应该很容易获得使用我的私钥计算的消息的ECDSA签名.但这是我在努力的地方. Libraries that I’ve found online似乎采用了一种更为复杂的方法,具有不同的移动部件,没有引用.pem文件以及关于生成新的公钥/私钥的讨论. 任何有关此步骤的帮助将不胜感激. 解决方法
看来Ruby和OpenSSL EC支持的文档和实际API目前都缺乏.特别是,在Ruby< = 2.3.1中,OpenSSL :: PKey :: EC不遵循与RSA和DSA密钥相同的API进行签名和验证.您想要做什么,但目前不能使用EC密钥,这是(这里的所有代码都假定您在某处调用了require'openssl'):
# Get the key,here I'm reading the file priv_key = OpenSSL::PKey.read(File.read('eckey.pem')) # This should be the appropriately formatted string data = "some data to sign" # The hash algorithm,I assume SHA256 is being used digest = OpenSSL::Digest::SHA256.new # This doesn't work in 2.3.1,but does in 2.4.0-preview1 signature = priv_key.sign(digest,data) 正如我在评论中指出的那样,这在Ruby 2.4.0-preview1中确实有效,但这对您来说可能没用多少. 要使它与当前的Ruby一起使用,您需要执行以下操作: # As before: priv_key = OpenSSL::PKey.read(File.read('eckey.pem')) data = "some data to sign" signature = priv_key.dsa_sign_asn1(OpenSSL::Digest::SHA256.digest(data)) 这两种技术都为您提供了二进制字符串.我认为在将其添加为请求标头之前,您需要对其进行base64编码. 提取公钥以检查签名验证也有点棘手(尽管您可以使用openssl命令行并读入文件). public_key方法返回OpenSSL :: PKey :: EC :: Point对象而不是实际键,因此我们需要从私钥中重新创建一个.验证方法适用于Ruby 2.3.1: pub = OpenSSL::PKey::EC.new(priv_key.group) pub.public_key = priv_key.public_key data = "some data to sign" digest = OpenSSL::Digest::SHA256.new puts pub.verify(digest,sig,data) Apple页面似乎没有指定要使用的哈希算法,但从我看到它看起来像SHA-256是正确的. (我也可能完全错了,Apple正在使用完全不同的格式.我很想知道这段代码是否适合你). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 《老罗Android》学习之xml解析
- postgresql – 使用pg_dump和psql -U postgres数据库移动数
- 什么是Swift相当于[UIColor colorWithWhite:alpha]
- opengl – 什么是依赖纹理读?
- ARM汇编中的ldr和adr的区别及其在uboot中相关源码的分析
- C语言中的函数指针学习笔记
- c – GLM是否与GLload和GCC兼容
- vb.net 教程 2-3 流程控制:循环语句 For...Next 2
- 2-swift学习之常量&变量
- There is no type initializer in Swift----One answer is