- php/
- Php 没有会话的认证系统-仅cookie-这是否合理安全?
Php 没有会话的认证系统-仅cookie-这是否合理安全?
Php 没有会话的认证系统-仅cookie-这是否合理安全?,php,security,authentication,cookies,Php,Security,Authentication,Cookies,我对你关于这个安全问题的建议/意见感兴趣
我在考虑这样做:
从userId+expirationTime生成的字符串中获取哈希MAC(sha256),并作为从某个机密字符串和$\服务器['HTTP\ U USER\ U AGENT']生成的密钥字符串
从userId+expirationTime中获取哈希MAC(sha256),并将其作为先前生成哈希的密钥(从步骤1开始)
从userId | expiration |和之前生成的哈希(从步骤2)生成字符串
使用“rijndael-256”算法加密
我对你关于这个安全问题的建议/意见感兴趣
我在考虑这样做:
从userId+expirationTime生成的字符串中获取哈希MAC(sha256),并作为从某个机密字符串和$\服务器['HTTP\ U USER\ U AGENT']生成的密钥字符串
从userId+expirationTime中获取哈希MAC(sha256),并将其作为先前生成哈希的密钥(从步骤1开始)
从userId | expiration |和之前生成的哈希(从步骤2)生成字符串
使用“rijndael-256”算法加密给定字符串(步骤3)。(mcrypt函数族)李>
编码到base64李>
将cookie设置为给定值
你觉得怎么样。这样行吗?
我还可以通过$\u SERVER['HTTP\u USER\u AGENT']检查实现什么,以确保cookie没有被盗(IP地址除外)
敏感数据cookie中的p.S.将只包含用户ID
编辑:
好的,我想澄清一些事情。
我试图使“安全”的身份验证系统不依赖于会话。所讨论的应用程序或多或少是作为纯restful api构建的
第二步:
问题:
"傅的协议并没有回答这个问题
问:傅的原型中只有一把钥匙-
col,即服务器密钥-
选项是使用此服务器密钥加密数据字段
但是,此解决方案并不安全。”
解决方案:
“我们解决这个问题的方法简单有效。
我们建议使用HMAC(用户名|到期时间,
sk)作为加密密钥。此解决方案具有以下-
它有三个很好的特性:第一,加密密钥
由于用户的不同,每个不同的cookie都是唯一的
名称和过期时间。请注意,每当
创建cookie时,新的过期时间包含在
第二,加密密钥是不可伪造的
因为服务器密钥是保密的-
每个cookie的加密密钥不需要在
服务器端或cookie中,而是com-
由服务器动态计算。
"
摘自Alex X.Liu1,Jason M.Kovacs撰写的论文《安全Cookie协议》
第4步:
加密数据(看起来像这样:'marko@example.com|342343244 | 324erfkh42fx34gc4fgcc423g4'),所以即使是客户也无法确切知道里面是什么
第五步:
Base64编码只是为了让最终的值更漂亮。我会咬一口
为了保持状态的任何外观,您需要使用某种类型的密钥来识别用户。该密钥作为cookie或通过查询字符串参数发送到浏览器
现在,该密钥的验证可以在web服务器本身(会话)内部进行,也可以通过检查其他存储机制(通常是数据库记录)进行
应该使用某种机制对密钥本身进行模糊处理。混淆的原因仅仅是,如果原始用户或其他人决定检查值,那么很难猜测其他键可能具有哪些值。例如,如果密钥是您的用户id(不推荐),并且您正在使用递增整数,那么猜测其他用户密钥就很简单了我想强调的是,混淆(甚至完全加密)密钥绝对不能防止会话被劫持。它所做的只是让猜测他人会话密钥变得更加困难
这就是说,我认为密钥应该与用户id无关,而应该是其他类似生成的GUID的近乎随机的值。坦率地说,基本64编码的GUID与加密用户id+时间的安全级别完全相同。只是其中一个在服务器上的计算量要比另一个大
当然,此密钥可以根据每个请求进行更改。浏览器发布某些内容,您生成一个新密钥并将其发送回。如果浏览器发布了一个过期的密钥,则将其记录并将其返回到登录屏幕。这将防止重播攻击。。在某种程度上。然而,它引入了其他挑战,例如在各种浏览器上使用后退按钮。所以,你可能不想走这条路
也就是说,您不能依赖于客户端IP地址,因为同一用户可能使用不同的IP发送后续请求。你不能依赖于浏览器指纹识别,因为任何体面的黑客工具都会捕获指纹并提交相同的值,不管他们在使用什么
现在,如果您真的想正确地执行此操作,您应该打开SSL。否则你就是在浪费时间。整个对话(从登录屏幕开始)需要加密。如果不是,那么有人可以简单地监听cookie,立即重播它并劫持会话。关键是他们不需要知道其中包含的值就可以使用它们。所以所有这些散列,等等,都只是会增加服务器负载的绒毛
我说过使用SSL吗?;)这将加密会话开始时的通信量,攻击者无法重播相同的数据包,因为他们必须与服务器协商自己的握手。这意味着您所要做的就是确保您使用的任何会话id都是不可猜测的,这样一个登录用户就不能接管另一个用户的会话
总之,你发布的方法是浪费时间。
您最好只获得一个10美元的SSL证书,并使用Base64编码的GUID作为会话ID。如何在服务器上存储会话信息并不重要。。。负载平衡情况除外。此时,它需要脱离进程并由数据库服务器支持。。但这是另一个问题。@Marko对这种“cookie中的会话”方法的安全性发表了一些评论:
首先,正如其他人所说,你需要一个安全的连接