【问题标题】:How to decrypt `.signed` when the encrypted value is found in the http header instead of in a cookie?当在http标头而不是cookie中找到加密值时,如何解密`.signed`?
【发布时间】:2016-04-30 06:50:45
【问题描述】:

我发送电子邮件地址为signed cookie:

cookies.signed[:user_email] = { value: user.email, expires: 24.hours.from_now }

稍后前端将其作为 HTTP 标头发回给我:

request.headers["HTTP_USER_EMAIL"]

如何从收到的标头解密到原始电子邮件地址?我尝试了下面的行,但它产生了错误:

NoMethodError 异常:#String:0x00000008a57a78 的未定义方法“签名”

email = request.headers["HTTP_USER_EMAIL"].signed unless (request.headers["HTTP_USER_EMAIL"] == nil)

使用debugger,我得到request.headers["HTTP_USER_EMAIL"]"Im9yZ29utcGxlLmNvbSI=--37ddc725d139f86095ae839012c31a14e" 的值。所以加密的值就在那里。

cookie 与标头的差异值:如果在 cookie 中找到加密值,您可以使用 cookies.signed[:http_user_email] 对其进行解密。我对request.headers["HTTP_USER_EMAIL"].signedrequest.headers.signed["HTTP_USER_EMAIL"] 的尝试与使用cookie 时基本相同,您将获取cookie 的加密值并在末尾添加.signed:"Im9yZ29utcGxlL".signed。那也行不通。但是如果在字符串中找到加密的值,那该怎么做呢?

或者您认为 API 身份验证不需要使用用户电子邮件地址的加密版本? 身份验证是基于电子邮件地址和令牌的组合完成的(令牌需要匹配作为令牌加密版本的摘要)。

【问题讨论】:

  • 对我来说 example@example.com 已经是一个原始电子邮件地址。旁注,而不是写request.headers["HTTP_USER_EMAIL"] == nil 你可以使用nil? 方法:request.headers["HTTP_USER_EMAIL"].nil?
  • 谢谢,我测试时给的值确实有问题。我将使用错误消息更新我的 OP。
  • 试试Rack::Session::Cookie::Base64::Marshal.new.decode(request.headers["HTTP_API_USER_EMAIL"])
  • 谢谢,不幸的是它返回nil(原因不是标题为nil,我检查了)。对于 cookie,我只使用cookies.signed[:email],它将解密 cookie 中的加密电子邮件地址。这里的不同之处在于代码不在 cookie 中,而是在 http 标头中。我试过request.headers.signed["HTTP_USER_EMAIL"],但也返回nil
  • 很遗憾,我无法提供帮助,因为我的主题不强:(

标签: ruby-on-rails security cookies encryption


【解决方案1】:

config/initializers/secret_token.rb 你应该有密码:

Demo::Application.config.secret_key_base = 'b14e9b5b720f84fe02307ed16bc1a32ce6f089e10f7948422ccf3349d8ab586869c11958c70f46ab4cfd51f0d41043b7b249a74df7d53c7375d50f187750a0f5'

解密:

content = request.headers["HTTP_USER_EMAIL"]
unescaped_content = URI.unescape(content)

crypt = ActiveSupport::MessageEncryptor.new(Rails.configuration.secret_key_base)
data =  crypt.decrypt_and_verify(unescaped_content)

在 4.0 中基于默认配置。 从 4.1 开始,您可以使用 config/secrets.yml 而不是 secret_token.rb

【讨论】:

    【解决方案2】:

    将值设置为 cookie 并使用签名访问它

    在你的情况下

    mail_signed = request.headers["HTTP_USER_EMAIL"]
    cookies[:mail]=mail_signed
    mail = cookies.signed[:mail]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2012-03-23
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      相关资源
      最近更新 更多