无状态令牌授权安全
Stateless Token Auth security
我是 ReST 的新手,正在实施 ReSTful 令牌身份验证,尝试以标准方式在移动网络应用程序中使用 Django-Rest-Framework JWT
- 客户端发送凭据
- 服务器验证并发回令牌和到期日期。从 db
中删除令牌
- 当用户发出请求并且令牌即将过期时客户端调用刷新令牌
- 根据客户端请求,服务器验证令牌签名
- 在过期的令牌移动应用程序上注销用户。移动应用程序检查过期时间而不是服务器
我决定让移动应用程序检查过期日期,因为我读到过期日期是 ReSTFul,检查它的服务器要求它存储不是 ReSTful
的令牌
我有几个关于上述实施的安全问题:
1) 无论发生多少次令牌刷新,获得一个令牌不会让攻击者完全访问用户的登录吗?
即使是通过 https,假设攻击者通过某种方式检索了令牌,即 ssl 拦截器 proxy.Obviously 移动应用程序将不允许他们登录,但他们可以通过调用来获取数据api 通过任何 HTTP 客户端使用令牌。
2) 如果服务器认为所有令牌都有效,那么首先刷新令牌的目的是什么?
this.However 中似乎没有前向安全性,如果服务器存储令牌并保留其到期日期,将停止完整的用户妥协,但不会停止每个会话的妥协。显然,使用 SSL 拦截器,他们仍然可以危害用户,但需要捕获每次登录。但是,该实现不是 ReSTful.
首先,过期的令牌是有效的令牌,但是您可以在采取任何操作之前检查令牌是否过期,并拒绝过期的令牌。您可以采取多种措施来提高应用的安全性:
您可以在令牌中添加散列密码。因此,如果用户丢失 his/her 手机,当密码在另一台设备上更改时,您可以拒绝使用旧密码哈希的令牌。
这个不完全是 restful,但也不是那么糟糕:您可以在数据库中添加一个名为 revokedTokens 的 table 来跟踪令牌的 ID(显然你应该将它添加到令牌)用户撤销,如果你稍后收到带有该令牌的请求,你可以拒绝它直到它过期。当它过期时,您可以从 table 中删除,因为过期的令牌无论如何都不会成为问题。
您可以在用户登录令牌时添加设备的主机名,并将其与请求的主机名进行比较,为 ssl 拦截器攻击提供额外的安全层。是的,这不是全面保护,但仍然好一点,因为攻击者除了从另一台设备发送令牌外还需要更改 his/her 主机名。
希望这对您有所帮助。
我是 ReST 的新手,正在实施 ReSTful 令牌身份验证,尝试以标准方式在移动网络应用程序中使用 Django-Rest-Framework JWT
- 客户端发送凭据
- 服务器验证并发回令牌和到期日期。从 db 中删除令牌
- 当用户发出请求并且令牌即将过期时客户端调用刷新令牌
- 根据客户端请求,服务器验证令牌签名
- 在过期的令牌移动应用程序上注销用户。移动应用程序检查过期时间而不是服务器
我决定让移动应用程序检查过期日期,因为我读到过期日期是 ReSTFul,检查它的服务器要求它存储不是 ReSTful
的令牌我有几个关于上述实施的安全问题:
1) 无论发生多少次令牌刷新,获得一个令牌不会让攻击者完全访问用户的登录吗?
即使是通过 https,假设攻击者通过某种方式检索了令牌,即 ssl 拦截器 proxy.Obviously 移动应用程序将不允许他们登录,但他们可以通过调用来获取数据api 通过任何 HTTP 客户端使用令牌。
2) 如果服务器认为所有令牌都有效,那么首先刷新令牌的目的是什么?
this.However 中似乎没有前向安全性,如果服务器存储令牌并保留其到期日期,将停止完整的用户妥协,但不会停止每个会话的妥协。显然,使用 SSL 拦截器,他们仍然可以危害用户,但需要捕获每次登录。但是,该实现不是 ReSTful.
首先,过期的令牌是有效的令牌,但是您可以在采取任何操作之前检查令牌是否过期,并拒绝过期的令牌。您可以采取多种措施来提高应用的安全性:
您可以在令牌中添加散列密码。因此,如果用户丢失 his/her 手机,当密码在另一台设备上更改时,您可以拒绝使用旧密码哈希的令牌。
这个不完全是 restful,但也不是那么糟糕:您可以在数据库中添加一个名为 revokedTokens 的 table 来跟踪令牌的 ID(显然你应该将它添加到令牌)用户撤销,如果你稍后收到带有该令牌的请求,你可以拒绝它直到它过期。当它过期时,您可以从 table 中删除,因为过期的令牌无论如何都不会成为问题。
您可以在用户登录令牌时添加设备的主机名,并将其与请求的主机名进行比较,为 ssl 拦截器攻击提供额外的安全层。是的,这不是全面保护,但仍然好一点,因为攻击者除了从另一台设备发送令牌外还需要更改 his/her 主机名。
希望这对您有所帮助。