发送 Sha256 散列作为 URL 参数作为 Rails 请求数据的签名

sending Sha256 hash as a URL param as signature for Rails request data

我注意到当我像这样发送 url 时:

http://localhost:3000/register/register_user/?sig=zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk+3FsXPr4=

当我使用它与控制器中使用 params[:sig] 的预期结果进行比较时,结果是这样的:

zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk 3FsXPr4=

由于某种原因,字符串末尾第 9 个字符 url 中的“+”号已转换为 space。

不确定为什么会发生这种情况,是只发生在 + 号上还是什么情况下。

Digest::SHA256.base64digest(data) 返回的结果有这个加号,所以我的签名验证失败。

解决此问题的最佳方法是什么?在一般情况下,仅在比较之前将“+”符号转换为 space 就足够了吗,还是有一些不那么丑陋的解决方法?

您需要url对其进行编码。要么进行搜索并将 + 替换为 %2B,要么使用 open-uri 强制编码。

require 'cgi'
sig = "zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk+3FsXPr4="
puts CGI.escape(sig)

这次测试了。

irb(main):008:0> require 'cgi'
=> true
irb(main):009:0> CGI.escape('zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk+3FsXPr4=')
=> "zaQ%2F876CwJMEEmrJqAOYHyEKBXy2s03NDmk%2B3FsXPr4%3D"
irb(main):010:0>