这种对用户进行身份验证/登录的方法安全吗?


Is this method of authenticating/logging in a user secure?

我有一个关于处理让用户登录到应用程序的最佳方法的问题。我想知道如何实现类似于像Snapchat这样的应用程序如何保持用户登录,即使他们关闭/打开他们的手机。我认为他们在设备上本地存储授权密钥以实现这一点是对的吗?我从来不想让用户登出,除非他们点击"登出"按钮,但我没有使用授权密钥保持人们登录的经验。

所以我想知道如果下面的方法将是一个好方法使用,或者如果它是不安全的/什么将是一个更好的方法来采取。首先,我有一个表在我的数据库与以下列:Device_id,用户名,密码,logged_in.

我当前的方法:

  • 应用启动时,获取设备的唯一ID。
  • 使用Javascript/php发送ID到数据库
  • 使用SQL检查数据库中的ID。
  • 如果ID不在数据库中,或者,如果与该ID关联的"logged_in"列表示"0"(意思是未登录),那么这意味着它是一个新设备/可能是一个新用户或用户当前注销了该设备(由于在上一个会话结束时按下"注销"按钮-"注销"按钮将"logged_in"列更改为"0")。
  • 所以应用程序现在为用户提供了输入登录详细信息的选项(用户名&密码),或者注册应用程序(创建用户名&密码)。
  • 如果这两个进程中的任何一个成功,数据库得到更新,用户能够使用应用程序("logged_in"列被更改为"1"-意味着用户登录)。
  • 当用户打开应用程序时,如果他们的ID在数据库中,并且相关的"logged_in"列="1",则不需要登录屏幕,他们已经登录并可以立即访问应用程序。
  • 如果某人在一个设备上登录了他们的帐户,但随后获得了一个新设备,并登录到那个设备(使用他们的用户名和密码),那么他们存储的设备ID将被他们的新设备ID覆盖。-这应该使他们在自己的设备上出现注销(因为他们的旧ID不会被找到,所以他们会被提示重新输入他们的用户名和密码,如果他们回到他们的旧手机)。

这是一个稳定和安全的方法来验证用户的详细信息,并保持人们登录到一个应用程序?如果他们想退出,他们仍然可以按下"退出"按钮,这将使"logged_in"列从"1"变为"0"。但也许这种方法有缺陷?如果你能告诉我最好的方法,我将非常感激。提前感谢!

设备的唯一ID将通过互联网。如果有一个节点监听你的通信,它会得到所有设备的唯一id,因此你需要加密它们,所以如果发送的数据,以任何方式被第三方监听,至少不要把原始数据交给他们。此外,我将使用盐渍加密过程,因此即使第三方能够对算法进行反向工程,其结果也与实际价值相去甚远。我会选择一个独立的名字,这对第三方来说没有任何意义。

一般来说,登录状态不使用标志,相反,当用户正确登录时,一些值存储在$_SESSION中,如user_id。通常,客户端为此目的使用cookie,您可以通过Javascript修改cookie值。如果不适合您,您不必使用一般方法,但不应该在没有混淆的情况下发送唯一的设备id。

这听起来不太安全。所有人需要做的就是欺骗deviceID以获得即时访问。

也许这篇文章可以给你一些关于如何处理这个问题的想法:

如何在运行Android应用程序时自动登录