身份验证过程,为什么将sessionID存储在数据库中?

时间:2015-04-23 16:07:16

标签: php android authentication

我对正常的认证过程有疑问。

我有很多谷歌,并且阅读了很多,但仍然不能很清楚身份验证的过程, 什么是sessionID? 为什么我们将sessionID存储在数据库中,因为我认为会话ID有时会过期。为什么我们还需要存储它们? 如果我将OAuth用于Android应用程序或桌面应用程序怎么办?

更多解释:

  1. 例如,我使用Form登录。用户发送“userName”和“passWord”,然后我使用MD5($ passWord),然后将它们全部发送到服务器URI,是吗?

  2. 然后Server获取userName和passWord,然后将passWord与数据库中的passWord进行比较,如果相同则正确。服务器将SessionId发送回用户,将设置cookie。这个过程是对的吗?

  3. 如果是正确的,服务器会将sessionID存储在数据库中,但sessionId会在一段时间后到期,为什么我们将会话ID存储在数据库中?

2 个答案:

答案 0 :(得分:1)

  1. 处理安全数据时,应使用SSL(https)。在密码上做MD5是没有意义的。如果我抓住了流量,我可以用暴力和/或彩虹表取消MD5。 MD5不是为了安全。它用于使用更小的数据块识别大块数据。

  2. 您不应将密码存储在数据库中。您应该在数据库中存储密码的盐渍哈希。然后,您对用户发送的密码进行加密和散列,并查看它是否与数据库中的密码相匹配。同样,不要使用MD5。使用更好(更长)的哈希 - 并确保它被盐渍。

  3. 服务器需要知道哪些会话已打开并正在使用中。所以,它必须存储它们。您不需要存储会话ID。服务器呢。会话到期时,服务器将删除会话。

答案 1 :(得分:1)

  

例如,我使用Form登录。用户发送" userName"然后我使用MD5($ passWord),然后将它们全部发送到服务器URI,是吗?

不。 Md5是弱哈希算法,还有其他更安全的哈希算法。除此之外,您生成的哈希应该比仅仅

更复杂
hash('whatever_algorithm', $password)

有像PHPass这样的库和像password_hash这样的函数可以帮助你。

作为协议,您应该使用SSL并转到 https

  

然后Server获取userName和passWord,然后将passWord与数据库中的passWord进行比较,如果相同,则对。服务器将SessionId发送回用户,将设置cookie。这个过程是对的吗?

这个过程是错误的,因为您不应该在数据库中保留明确的凭据数据,这是凭据'应存储的哈希值,您应该尝试使用用户提供的用户名+密码重现它。 哈希是一种不对称算法:它只有一种方式。

您可以通过在会话中添加一些遵循特定预期输入/输出交换的身份验证步骤来强化安全性。

  

如果是正确的,服务器会将sessionID存储在数据库中,但是sessionId会在一段时间后到期,为什么我们将会话ID存储在数据库中?

您将sessionID存储在活动状态(未计时),这样用户仍然可以连接而无需重新进行身份验证。 当会话返回错误代码时,您将其ID保留在数据库中,以便跟踪相关信息并能够生成日志。 例如,你可以:

  • 在会话表中添加客户端IP,以便跟踪 WHO
  • 添加与您的会话相关联的error_codes,以便您跟踪 WHAT
  • 在表格中添加日期时间,以查看 WHEN

如果会话期间发生错误,您可能需要知道原因(有人试图绕过您的会话安全性或会话实施中的错误)。