Session 正确的登录过程

Session 正确的登录过程,session,cookies,login,sha1,Session,Cookies,Login,Sha1,我以前没有处理过登录过程,所以这对我来说是一个新领域,我在谷歌上找到的似乎都是处理这个过程的相互冲突的方法,所以我希望有人能帮助澄清 到目前为止,我有一个saltedsha1散列,由用户名、密码和salt变量混合而成。 当用户登录他们的凭证时,这个散列会被发送到sql,如果找到,就会返回一个用户ID(或其他)。所以我知道他们是经过认证的。 有了它,我可以用会话变量处理他们的会话 到目前为止是这样吗 无论如何,我想有“记住我”的选项,并且正在考虑将一些东西存储在cookie中,但不确定要放什么,因

我以前没有处理过登录过程,所以这对我来说是一个新领域,我在谷歌上找到的似乎都是处理这个过程的相互冲突的方法,所以我希望有人能帮助澄清

到目前为止,我有一个saltedsha1散列,由用户名、密码和salt变量混合而成。 当用户登录他们的凭证时,这个散列会被发送到sql,如果找到,就会返回一个用户ID(或其他)。所以我知道他们是经过认证的。 有了它,我可以用会话变量处理他们的会话

到目前为止是这样吗

无论如何,我想有“记住我”的选项,并且正在考虑将一些东西存储在cookie中,但不确定要放什么,因为据我所知,存储散列与将用户名和密码放在纯文本中几乎是一样的

我很困惑,有人能解释一下吗


提前感谢

通常,使用平台提供的身份验证方法比自己创建身份验证方法更好。有很多不明显的问题,你可以很容易地让自己去面对。你在使用哪个平台?您正在使用web框架吗

像SHA1这样的通用散列不适合用于密码散列,因为当您需要非常慢的东西时,它们被优化为非常快。有关这方面的讨论,请参阅

无论如何,我想有“记住我”的选项,并且正在考虑将一些东西存储在cookie中,但不确定要放什么,因为据我所知,存储散列与将用户名和密码放在纯文本中几乎是一样的


散列函数被设计成单向函数,所以不,它不同于将用户名和密码放在纯文本中。但是,如果您这样做,您必须创建一种方法,让某人使用散列而不是用户名和密码进行身份验证,这与将用户名和密码存储在客户端是一样的(无论如何,就您而言).

使用平台提供的身份验证方法通常比自己创建身份验证方法更好。有很多不明显的问题,你可以很容易地让自己去面对。你在使用哪个平台?您正在使用web框架吗

像SHA1这样的通用散列不适合用于密码散列,因为当您需要非常慢的东西时,它们被优化为非常快。有关这方面的讨论,请参阅

无论如何,我想有“记住我”的选项,并且正在考虑将一些东西存储在cookie中,但不确定要放什么,因为据我所知,存储散列与将用户名和密码放在纯文本中几乎是一样的


散列函数被设计成单向函数,所以不,它不同于将用户名和密码放在纯文本中。但是,如果您这样做,您必须创建一种方法,让某人使用散列而不是用户名和密码进行身份验证,这与将用户名和密码存储在客户端是一样的(无论如何,就您而言).

我喜欢您使用salt进行哈希运算,但我认为没有必要使用用户名进行哈希运算,只有密码+salt就足够了。特别是,如果您希望为您的系统选择可更改的用户名,那么它将造成重新设置的开销

对于“记住我”选项,我认为您不应该在客户端cookie中存储任何凭据。只有会话ID应该足够了。如果要使其真正安全,应该使用服务器颁发的客户端证书


我喜欢您使用salt进行哈希运算,但我认为没有必要使用用户名进行哈希运算,只有密码+salt就足够了。特别是,如果您希望为您的系统选择可更改的用户名,那么它将造成重新设置的开销

对于“记住我”选项,我认为您不应该在客户端cookie中存储任何凭据。只有会话ID应该足够了。如果要使其真正安全,应该使用服务器颁发的客户端证书


您的身份验证很好。如果你想让它更安全,你可以通过SSL加密连接来传输登录信息,这样就没有人可以读取网络上发生的事情

记住标记非常简单,假设您想要一个有效期为14天的记住我的函数

没有经过身份验证会话的陌生人来到您的站点:

  • 检查cookie中是否有“记住我”标记
  • 如果是,请检查您是否可以在数据库中找到此RememberMe标记,并检查“valid until”列是否仍然有效(日期比较)
  • 如果找到有效的令牌,则可以设置用户id并对其会话进行身份验证
  • 如果找不到有效的令牌,请在必要时将用户重定向到登录页面
  • 当用户填写登录表单并成功验证其身份时:

    使用适当的哈希函数生成令牌。您散列的令牌可能看起来像“[Timestamp]--[userpwd]”,因此它(几乎)绝对是唯一的!将令牌和日期保存到与用户id连接的数据库中,直到令牌有效(例如,从现在算起(+14天)。如果存在过期令牌,请将其替换,因为您不需要存储过期令牌

    如果用户通过单击注销按钮或类似按钮注销,只需删除数据库中的令牌记录和用户的cookie即可


    就这样

    您的身份验证很好。如果你想让它更安全,你可以通过SSL加密连接来传输登录信息,这样就没有人可以读取网络上发生的事情

    记住标记非常简单,假设您想要一个有效期为14天的记住我的函数

    没有身份的陌生人
    userid ; user agent ; first two ip segments ; current timestamp ; your application secret token 
    
    auth=userid;timestamp;hash-of-the-above