Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 发送Sha256哈希作为URL参数作为Rails请求数据的签名_Ruby On Rails 3_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 3 发送Sha256哈希作为URL参数作为Rails请求数据的签名

Ruby on rails 3 发送Sha256哈希作为URL参数作为Rails请求数据的签名,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails 3,Ruby On Rails 4,我注意到,当我发送这样的url时: http://localhost:3000/register/register_user/?sig=zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk+3FsXPr4= 当我使用它与控制器中使用params[:sig]的预期结果进行比较时,结果如下: zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk 3FsXPr4= 出于某种原因,url中字符串末尾第9个字符处的“+”符号已转换为空格 不知道为什么会发生这种情况,

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

http://localhost:3000/register/register_user/?sig=zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk+3FsXPr4=
当我使用它与控制器中使用params[:sig]的预期结果进行比较时,结果如下:

zaQ/876CwJMEEmrJqAOYHyEKBXy2s03NDmk 3FsXPr4=
出于某种原因,url中字符串末尾第9个字符处的“+”符号已转换为空格

不知道为什么会发生这种情况,不管是只发生+符号还是什么

Digest::SHA256.base64digest(数据)返回的结果有这个加号,因此我的签名验证失败


解决这个问题的最好方法是什么?在一般情况下,仅仅在比较之前将“+”符号转换为空格就足够了吗?或者,这是一种不那么难看的处理方式吗

您需要对其进行url编码。执行搜索并将+替换为%2B,或者使用开放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>

这似乎没什么用。zaQ/876CWJMEEMRJQAOYYEKBXY2S03NDMK+3FsXPr4=上的puts的输出是加号是计算哈希中可能出现的唯一字符吗?或者还有其他需要翻译的东西吗?等号也会让你看到像CGI这样的东西。在这方面,escape比OpenURI做得更好。