Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 没有会话的认证系统-仅cookie-这是否合理安全?_Php_Security_Authentication_Cookies - Fatal编程技术网

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中的会话”方法的安全性发表了一些评论:

    首先,正如其他人所说,你需要一个安全的连接