在 PHP 中加密 cookie
Posted
技术标签:
【中文标题】在 PHP 中加密 cookie【英文标题】:Encrypting cookies in PHP 【发布时间】:2011-02-08 13:24:12 【问题描述】:如何在 php 中加密和解密 cookie 的值(加密的安全性如何)
【问题讨论】:
我看不出这有什么帮助,您应该使用 $_SESSION[] 获取敏感信息。 【参考方案1】:有多种不同的方法可以对 cookie 和其他地方的信息进行加密。加密的强度会因您选择进行实际加密的方法而异。 mycrypt
是一个很好的起点。 See this answer 使用 mcrypt 的示例。
我不建议在 cookie 中放入任何敏感信息,即使它会被加密。太诱人了,有人破解。如果可以,请尝试坚持会话。
【讨论】:
“对某人来说太诱人了” 但是......大概......如果你使用强加密,没有密钥,他们无法破解它。如果他们拥有密钥,则意味着他们已经破解了您的服务器(在一定程度上具有破坏性),因此您需要担心更大的问题。例如 cookie 的过期时间, 可能被认为对存储在客户端很敏感,但将其存储在客户端加密的优势很明显:您可以立即检查会话是否仍然有效,除非他们破解了您的盒子,否则他们无法设置它,无论如何。【参考方案2】:我完全同意其他答案:如果数据真正敏感,则应将其存储在服务器端的会话中,而不是 cookie 中。
至于加密 cookie 内容的方法,Suhosin PHP 扩展提供了transparently encrypt all cookies 的能力。如果您有能力安装 PHp 扩展,这对您来说可能比编写自己的加密方案更容易,也可能不会。
【讨论】:
【参考方案3】:如果 cookie 是安全加密的(例如,使用定期更改的服务器存储的秘密),我认为在 cookie 中存储有用的数据没有问题。为什么要存储在服务器上?让客户为改变做一些工作——尤其是在偏好方面。为什么服务器必须不断地从会话文件中存储和检索数据?如果您有成千上万的用户访问您的网站怎么办?现在您必须维护数十万个会话文件。
【讨论】:
OP 的问题是“我如何在 PHP 中加密 cookie,它的安全性如何?”,而您的回答是“我可以看到这是一个人想做的有用的事情” .此处没有回答 OP 问题的任何部分。【参考方案4】:我能想到一个合理的用途。假设您有一个大型服务器场,您将在数据库和/或 memcached 服务器上遇到处理会话请求的瓶颈。“此用户是否已登录?”
如果您要将用户会话数据作为加密值存储在 cookie 中,那么您可以避免进行大量读/写操作,并允许无限大小的 cookie 存储,因为对您的其他方面的影响为 0而不是 CPU 受限于 cookie 数据的加密/解密。
Ruby on Rails 默认情况下会这样做——尽管它只对数据进行签名而不对其进行加密。还有一种替代实现,它使用自己的密钥和签名加密数据,因此您的用户无法看到您在他们的会话中存储的数据。
【讨论】:
OP 的问题是“我如何在 PHP 中加密 cookie,它的安全性如何?”,而您的回答是“我可以看到这是一个人想做的有用的事情” .此处没有回答 OP 问题的任何部分。【参考方案5】:我不能简单地想到加密 cookie 中的数据很有用的情况。如果您想保留有关用户或其偏好、信息等的秘密数据,请将其存储在服务器上的文件、会话或数据库中,而不是存储在客户端的计算机中。
另一方面,如果您创建身份验证,那么您应该使用会话而不是创建秘密加密的 cookie 值。会话不是白白实施的,它们是要走的路。
【讨论】:
不是 RESTful API 无状态的重要组成部分吗?在这种情况下,通过带有密钥的加密 cookie 存储敏感数据是非常重要的。还是我错过了什么? 如果你的 api 真的是无状态的,则不存在会话。应该是负责存储信息 beetwen 请求的客户。 “我不能简单地想到加密cookie中的数据很有用的情况” OP没有问你是否可以;据推测,OP知道“为什么”,他问“如何”。你没有回答那个问题。 这根本不是问题的答案 这是一个。假设您希望您的访问者能够在您的页面上使用为他们量身定制的功能,而不必跳过“登录”的障碍。对于任何与金钱有关的事情,我都同意你的看法。但还有其他情况不需要这种级别的安全性,但加密的混淆是有价值的。以上是关于在 PHP 中加密 cookie的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP 中取消加密/重新加密 ColdFusion 加密字符串