将Sha256哈希作为URL参数发送为Rails请求数据的签名

时间:2017-08-29 18:48:52

标签: ruby-on-rails-3 ruby-on-rails-4

我注意到当我发送这样的网址时:

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

当我使用控制器中的params [:sig]将其与预期结果进行比较时会发生什么:

zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk 3FsXPr4=

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

不确定为什么会发生这种情况,是否只会出现+符号或什么。

Digest :: SHA256.base64digest(data)返回的结果有加号,因此我对签名的验证失败。

解决此问题的最佳方法是什么?在一般情况下,只是在比较之前将'+'符号转换为空格或者是一些不那么难看的解决方法是否足够?

1 个答案:

答案 0 :(得分:1)

您需要对其进行网址编码。使用open-uri执行搜索并替换+和%2B或强制编码。

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>