发送 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>
我注意到当我像这样发送 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>