web-dev-qa-db-fra.com

Quelle est la différence entre les cookies signés et cryptés dans Rails?

La documentation de ActionDispatch::Cookies Donne des descriptions presque identiques pour les cookies signés et les cookies cryptés. Il semble que les deux utilisent secrets.secret_key_base Pour empêcher la falsification côté client. http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html

Cookies signés

Définit un cookie signé, qui empêche les utilisateurs de falsifier sa valeur. Le cookie est signé par la valeur secrets.secret_key_base De votre application. Il peut être lu en utilisant la méthode signée cookies.signed[:name]

cookies.signed[:user_id] = current_user.id

Cookies cryptés

Définit une valeur de cookie crypté avant de l'envoyer au client, ce qui empêche les utilisateurs de lire et de falsifier sa valeur. Le cookie est signé par la valeur secrets.secret_key_base De votre application. Il peut être lu en utilisant la méthode cryptée cookies.encrypted[:name]

cookies.encrypted[:discount] = 45

Ma question est: quelle est la différence entre les deux?

Quand voudriez-vous utiliser l'un sur l'autre?

39
Sean Huber

C'est subtil, mais la réponse se trouve dans la documentation que vous avez fournie. Les cookies signés protègent uniquement contre la falsification, tandis que les cookies cryptés protègent contre la lecture et la falsification.

Plus précisément, les cookies signés appellent ActiveSupport::MessageVerifier pour ajouter un résumé (généré à l'aide de secret_key_base) au cookie. Si la valeur du cookie est modifiée, le résumé ne correspondra plus, et sans connaître la valeur de secret_key_base, le cookie ne peut pas être signé. Cependant, la valeur du cookie est simplement encodée en base64 et peut être lue par n'importe qui.

Cookies cryptés appelés ActiveSupport::MessageEncryptor pour chiffrer réellement la valeur du cookie avant de générer le résumé. Semblable aux cookies signés, si la valeur du cookie est modifiée, le résumé ne correspondra plus, mais en outre, la valeur du cookie ne peut pas être déchiffrée sans le secret_key_base.

Quant à savoir quand vous utiliseriez des cookies cryptés ou signés, cela se résume à la sensibilité des informations que vous stockez dans le cookie. Si vous ne souhaitez vous protéger que si quelqu'un modifie le cookie, signez-le, mais si vous devez également garder les données secrètes, chiffrez-les.

49
Brian