如何在http标头中找到加密值而不是在cookie中解密`.signed`?

时间:2016-01-23 19:07:53

标签: ruby-on-rails security cookies encryption

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

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

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

request.headers["HTTP_USER_EMAIL"]

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

  

NoMethodError异常:未定义的方法`signed'对于#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身份验证?根据电子邮件地址的组合进行身份验证和令牌(令牌需要匹配摘要,该摘要是令牌的加密版本)。

2 个答案:

答案 0 :(得分:1)

将值设置为cookie并使用签名

访问它

所以在你的情况下

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

答案 1 :(得分: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