gpt4 book ai didi

ruby - 在没有命令行的情况下在 Ruby 中创建数字签名

转载 作者:太空宇宙 更新时间:2023-11-03 18:08:44 25 4
gpt4 key购买 nike

我想将此 unix 脚本迁移到 ruby​​:

echo -n "loremipsum" | openssl dgst -md5 -hex -sign keys/#02299991.privKey.pem

结果如下:

(stdin)= 08d9d6496a5146bc1955ad35c884e3b843d441eebc9ed7908b220e9414132dad57dc0f4744e5ec4a9a819e20f4099e2c90186b4684b3b52d1409dd4ca5bc86e7c16dbb64e6cf41d695a7e979744616fe92e5347a7acbb1e1da902d3cfc629927adf3e119f33d2cbc89f90f9494d44becbf93855d09460a67e2615e7d8df7e4f8

我正在使用以下代码:

key = OpenSSL::PKey::RSA.new(File.read("keys/#02299991.privKey.pem"))
md5_hash = Digest::MD5.hexdigest 'loremipsum' # result: 65a73f29730d3519bd7dd98ab954ed56
key.private_encrypt md5_hash

这就是 private_encrypt 创建的哈希值与我使用命令行生成的哈希值非常不同的问题:

"B62\xDA\x80\xF9\xFF]\xCE;\a\xB3)fC\xA8v\x9EM5\xF8Z\xA9\x00\b\xA4\x95 \x84\x8A\xD6:\xDA\xCE\x1D\x01\x9F&\xEB\xD5\xD6\xDF\xC0\v\xD8i\xA0\x86\x8E\e`\x98\xB9\x19\xEC\xA7\x8A\\.\xD1\xCC\xFC\x93\x1C\xFF\xFFh\xAFw\t\xFF\xC8Z\xEC\xBDP\x9C_\x03%\x85:\x04\x1C=\xF3\xAC\xE1\x917TO\x94\xB2\x9Fd`3\x98\x04\x93\xBFS\\\xD1Z\xF9\xBD\x91\xE3\xA1:\xA3B22U_FI'`0i\x8D(\x9B`"

怎么了?

最佳答案

您的 openssl 命令和您的 Ruby 代码做的事情截然不同。您的 openssl 命令说“生成一个用我的 RSA key 签名的 MD5 摘要并以十六进制格式打印它。”你的 Ruby 代码说“生成一个(未签名的)十六进制格式的 MD5 摘要,然后用我的 RSA key 加密它。”摘要生成和加密不是一回事,不会给您相同的结果。

openssl 命令等效的 Ruby 是这样的:

data = 'loremipsum'
digest = OpenSSL::Digest::MD5.new
pkey = OpenSSL::PKey::RSA.new(File.read("keys/#02299991.privKey.pem"))
signature = pkey.sign(digest, data)
hex_signature = signature.unpack('H*').first

前四行实际上是来自 OpenSSL::PKey::PKey#sign 文档的逐字记录.该方法返回一个二进制字符串(我找不到直接获取十六进制字符串的方法;如果有人知道方法请发表评论),所以我们必须使用 String#unpack把它变成一个十六进制字符串。 (unpack 返回一个数组,ergo .first。)

关于ruby - 在没有命令行的情况下在 Ruby 中创建数字签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38484724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com