ruby-on-rails - 在Ruby/Rails中,如何解密由PKCS7加密和签名的字符串

标签 ruby-on-rails encryption pkcs#7

this RailsCast on PayPal它向您展示了如何在将 URL 参数发送到 PayPal 之前对其进行加密。

PAYPAL_CERT_PEM = File.read("#{Rails.root}/certs/paypal_cert.pem")
APP_CERT_PEM = File.read("#{Rails.root}/certs/app_cert.pem")
APP_KEY_PEM = File.read("#{Rails.root}/certs/app_key.pem")
def encrypt_for_paypal(values)
    signed = OpenSSL::PKCS7::sign(OpenSSL::X509::Certificate.new(APP_CERT_PEM),        OpenSSL::PKey::RSA.new(APP_KEY_PEM, ''), values.map { |k, v| "#{k}=#{v}" }.join("\n"), [], OpenSSL::PKCS7::BINARY)
    OpenSSL::PKCS7::encrypt([OpenSSL::X509::Certificate.new(PAYPAL_CERT_PEM)], signed.to_der, OpenSSL::Cipher::Cipher::new("DES3"),        OpenSSL::PKCS7::BINARY).to_s.gsub("\n", "")
end

假设我正在为 PayPal 的服务器编写代码。我将如何解密这个字符串?在我看来,这段代码既用公钥对字符串进行签名(以验证真实性),又对字符串进行加密(以提供隐私)。用于执行反向操作、解密和验证真实性的代码是什么?

谢谢。

最佳答案

嗨约翰,这里是使用 ruby​​ openssl 加密/解密的示例。 请注意,它使用 AES 作为密码,因为 DES3 似乎在我的 ruby​​ openssl 版本中被删除。 在字符串上调用 gsub 来替换换行符似乎会破坏它,所以我将其注释掉。 希望对您有所帮助。

require 'openssl'

PAYPAL_CERT_PEM = File.read("paypal_cert.pem")
@paypal_cert = OpenSSL::X509::Certificate.new(PAYPAL_CERT_PEM)

APP_CERT_PEM = File.read("app_cert.pem")
@app_cert = OpenSSL::X509::Certificate.new(APP_CERT_PEM)

APP_KEY_PEM = File.read("app_key.pem")
@app_key = OpenSSL::PKey::RSA.new(APP_KEY_PEM, '')

PAYPAL_KEY_PEM = File.read("paypal_key.pem")
@paypal_key = OpenSSL::PKey::RSA.new(PAYPAL_KEY_PEM, '')

CERT_STORE = OpenSSL::X509::Store.new
CERT_STORE.add_cert(@app_cert)

data = Hash.new
data['customer_id'] = '123456789'
data['customer_name'] = 'Mr Smith'

def encrypt_for_paypal(values)
data_name_values = values.map { |k, v| "#{k}=#{v}" }

signed_data = OpenSSL::PKCS7::sign(@app_cert, @app_key, data_name_values.join("\n"), [], OpenSSL::PKCS7::BINARY)

cypher = OpenSSL::Cipher::new("AES-128-CFB")

encrypted_data = OpenSSL::PKCS7::encrypt([@paypal_cert], signed_data.to_der, cypher, OpenSSL::PKCS7::BINARY)

encrypted_data.to_s #.gsub("\n", "")
end

def decrypt_by_paypal(encrypted_data)
received_encrypted_data = OpenSSL::PKCS7.new(encrypted_data)

received_signed_data = received_encrypted_data.decrypt(@paypal_key, @paypal_cert)

p7_received_signed_data = OpenSSL::PKCS7.new(received_signed_data)

p7_received_signed_data.verify(nil, CERT_STORE, nil, OpenSSL::PKCS7::NOVERIFY)

p7_received_signed_data.data
end

encrypted_txt = encrypt_for_paypal data
puts decrypt_by_paypal encrypted_txt

关于ruby-on-rails - 在Ruby/Rails中,如何解密由PKCS7加密和签名的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9062830/

相关文章:

c# - 在 ASP.NET 中使用 SetAuthCookie() 仅存储 userId 是否安全

c# - 如何在 C# PCL 中解码/解密 SignedCMS/PKCS#7

ruby-on-rails - 按唯一值分组,同时求和/添加其他值

java - 在 java 中加密,在 node.js 中解密

java - 是否有模拟 C 的 crypt 函数的 java 函数?

c# - 使用 .pfx 证书封装、签名和创建 PKCS#7 DER 消息

java - 将证书添加到 CMS 签名数据

mysql - 以 Ruby on Rails 3 中 2 个表的形式显示数据

ruby-on-rails - 如何使用 permit 或 require 过滤 params hash 中的键?

ruby-on-rails - 在 Angular 脚本中重用 Rails 部分?