如何验证从一个Rails应用发送到另一个的请求

时间:2019-02-15 20:18:39

标签: ruby-on-rails ruby

我有2个Rails应用程序。

App1需要发送将由App2保存的数据。

我想知道创建安全API端点的最佳方法。

我如何验证App1发送到App2的请求

我与其他需要验证请求的API一起使用,例如Facebook。

使用Facebook,他们在标头中发送了一个令牌,我可以计算该令牌并进行比较以验证请求。

def verify_webhook(request)

    sha1 = request.headers["X-Hub-Signature"].gsub("sha1=", "")
    digest = OpenSSL::Digest.new('sha1')
    request.body.rewind
    data = request.body.read

    # Calculate a sha1 with the app key and payload from the post request
    calculated_hmac = OpenSSL::HMAC.hexdigest(digest, ENV['FB_APP_SECRET'], data)

    # Computate hmac and see if verified is true
    verified = ActiveSupport::SecurityUtils.secure_compare(calculated_hmac, sha1)

    verified
end

我认为解决方案是相似的,但是我找不到我要在网上进行的操作的文档,我对术语不太熟悉,因此我可能会搜索错误的内容。

有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

在设计与安全相关的功能时,您应该首先建立一个威胁模型。其中包括全面了解攻击面-您的应用程序是通过Internet还是仅通过公司网络进行通信? -并对谁将试图破坏您的应用程序以及他们愿意并有能力为此投入多少精力做出一些假设。

对于低威胁环境,如@max的注释中所述,在HTTP头中传输的预共享密钥/秘密就足够了:您只需为两个应用程序提供一个密钥,然后在每次调用时将其发送到HTTP头中-当然应该通过TLS加密的连接进行。

如果您的威胁模型包括可能能够破坏TLS加密连接并从那里闪烁预共享秘密的攻击者,则可以将其保留一个缺口,而不必将密钥本身转移到标头中,通过HMAC进行校验和并在客户端上进行比较-就像您使用Facebook SDK的示例一样。您可能还希望添加一个加密随机数,以避免重播攻击。

最后,在设计与安全性相关的代码时,您可能希望由具有安全性经验的人对其进行审查,因为很容易出错,使所有工作徒劳无功。