首页 > 解决方案 > 如何在 Faraday (Rails 5) 中加密 JSON 有效负载

问题描述

我对 Rails 有点陌生,并且使用 Faraday gem 进行 API 调用,所以请保持温和。:)

我们在 Rails 应用程序中对所有服务器发起的 API 调用使用 Faraday (gem)。我们使用的其中一项外部服务要求我们使用服务提供商提供的 RSA 4096 公钥加密所有有效负载。

通常我们使用法拉第的方式是:

connection = Faraday.new(:url: url) do |faraday|
    faraday.request :url_encoded
    faraday.response :logger       
    faraday.adapter  Faraday.default_adapter  
end

parameters = '{
    "key1": "value1"
    "key2":XXXXXX,
    .
    .

}'

response = connection.post do |req|
    req.url some_url
    req.headers['Content-Type'] = 'application/json'
    req.body = <encrypted JSON parameters given in **parameters**>
end

我想知道我们是否可以在将参数对象转换为 JSON 并将其传递到req.body属性后直接加密它,或者是否有更系统的方法来做同样的事情。

非常感谢您的帮助!

标签: ruby-on-railsjsonrubyruby-on-rails-5faraday

解决方案


是的,为什么不?我可能会遗漏一些东西。

您可以加密任何字符串并通过请求正文传递它。但是,如果您这样做,您可能希望根据您的 application/json 标头保持正确的内容类型。

JSON:

{ 
     name: "Alice", 
     age: 25 
}

我们可以加密每个单独的键值对:

{ 
     name: gtLHeq+OR9JDvAlTFN98VZlqCrrRvFITw5TnFwGHCB0+8=, 
     age: gt9gI3dSssl5BOcSpYr0egkye98VZlqCrrRvFITw5TnFwGHCB0+8= 
}

或者我们可以加密整个 JSON 块:

{ 
     secret: W29Ud80egkye98VZlqCrrRvFITw5TnFwGHCB0+8= 
}

我将加密的 JSON 包裹在更多的 JSON 中,这样我们就不会破坏内容类型。但我不确定您的第 3 方服务是否具备解密整个块的能力,或者它是否在 JSON 中查找特定的键值对并对其进行解密。这是重要的区别。您几乎可以加密任何东西并通过网络传输它,但如果侦听器不具备以该格式解密您的数据的条件,您就不得不遵守它们的格式。


推荐阅读