【发布时间】:2011-10-01 16:32:41
【问题描述】:
我对您对此安全问题的建议/意见感兴趣。
我正在考虑做这样的事情:
- 从由 userId + expirationTime 构建的字符串中获取哈希 MAC (sha256),并作为由某个秘密字符串和 $_SERVER['HTTP_USER_AGENT'] 构建的密钥字符串。
- 从 userId + expireTime 中获取哈希 MAC (sha256),并作为之前生成的哈希(从第 1 步开始)的密钥。
- 根据 userId|expiration| 构建字符串和之前制作的哈希(从第 2 步开始)。
- 使用“rijndael-256”算法加密给定的字符串(从第 3 步开始)。 (mcrypt 系列函数)。
- 编码为 base64。
- 使用给定值设置 cookie。
你怎么看。这个可以吗? 我还可以通过 $_SERVER['HTTP_USER_AGENT'] 检查实现什么,以确保 cookie 不被盗(IP 地址除外)?
附:来自敏感数据的 cookie 将仅包含 userId。
编辑: 好的,清除一些东西。 我正在尝试制作不依赖会话的“安全”身份验证系统。有问题的应用程序或多或少地构建为纯 RESTful api。
第 2 步:
问题: “傅的协议没有对此提供答案 题。傅的原型中只有一把钥匙—— col,即服务器密钥。一个简单的解决方案 化是使用这个服务器密钥来加密数据字段 每个cookie;但是,此解决方案并不安全。”
解决方案: “我们对这个问题的解决方案简单而有效。 我们建议使用 HMAC(用户名|过期时间, sk) 作为加密密钥。该解决方案具有以下 降低三个良好的性能。一、加密密钥 由于用户的原因,对于每个不同的 cookie 都是唯一的 名称和到期时间。请注意,每当一个新的 cookie 被创建,新的过期时间被包含在 饼干。二、加密密钥不可伪造 因为服务器密钥是保密的。三、加密 每个 cookie 的 key 不需要任何存储 服务器端或在 cookie 中,相反,它是 com- 由服务器动态放置。 " 摘自 Alex X. Liu1、Jason M. Kovacs 的论文“A Secure Cookie Protocol”
第 4 步: 加密数据(看起来像这样:'marko@example.com|34234324234|324erfkh42fx34gc4fgcc423g4'),这样即使客户也无法确切知道里面是什么。
第 5 步: Base64 编码只是为了使最终值漂亮。
【问题讨论】:
-
第2-4步需要什么?您不会通过在其中包含嵌套哈希来使哈希更安全,出于性能原因,最好只运行一次哈希。
-
大多数会话管理设置使用 cookie 来存储会话 ID,并使用 GET ID 作为备份(如有必要并在会话设置中指明)。
-
@Marko Jovanovic:你不能 100% 确定 cookie 劫持。
-
@Marko - 那么你得到的保护只不过是默默无闻的安全,意思是,几乎没有。不管密钥的算法多么花哨,有人可以用http拦截和劫持。
-
Cookies 不是安全功能。
标签: php security authentication cookies