我对正常的认证过程有疑问。
我有很多谷歌,并且阅读了很多,但仍然不能很清楚身份验证的过程, 什么是sessionID? 为什么我们将sessionID存储在数据库中,因为我认为会话ID有时会过期。为什么我们还需要存储它们? 如果我将OAuth用于Android应用程序或桌面应用程序怎么办?
更多解释:
例如,我使用Form登录。用户发送“userName”和“passWord”,然后我使用MD5($ passWord),然后将它们全部发送到服务器URI,是吗?
然后Server获取userName和passWord,然后将passWord与数据库中的passWord进行比较,如果相同则正确。服务器将SessionId发送回用户,将设置cookie。这个过程是对的吗?
如果是正确的,服务器会将sessionID存储在数据库中,但sessionId会在一段时间后到期,为什么我们将会话ID存储在数据库中?
答案 0 :(得分:1)
处理安全数据时,应使用SSL(https)。在密码上做MD5是没有意义的。如果我抓住了流量,我可以用暴力和/或彩虹表取消MD5。 MD5不是为了安全。它用于使用更小的数据块识别大块数据。
您不应将密码存储在数据库中。您应该在数据库中存储密码的盐渍哈希。然后,您对用户发送的密码进行加密和散列,并查看它是否与数据库中的密码相匹配。同样,不要使用MD5。使用更好(更长)的哈希 - 并确保它被盐渍。
服务器需要知道哪些会话已打开并正在使用中。所以,它必须存储它们。您不需要存储会话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保留在数据库中,以便跟踪相关信息并能够生成日志。 例如,你可以:
如果会话期间发生错误,您可能需要知道原因(有人试图绕过您的会话安全性或会话实施中的错误)。