找不到任何关于实现OAuth 2刷新令牌持久性的最佳方法和关于应该存储什么以及如何存储的共同意见的指南。
虽然Taiseer Joudeh有一篇非常好的关于ASP.NET Web API中OAuth授权的教程。 这是文章中的RefreshTokens表:
其中:Id - 唯一令牌标识符的哈希值,Subject - 用户名,ClientId - 应用程序标识符,ProtectedTicket - 序列化访问令牌。
我想证明或推翻SO社区做出的一些决定。 所以这里是我的担忧:
1.为什么我们要保留短期的access_token?目前我可以想到两个原因反对这种方法。首先,当您在任何地方保存用户的访问票据时,它可能是安全威胁,只等着有人抓住它们,然后重用它们对于不起疑的资源服务器(记住,他们应该使用相同的算法来序列化/反序列化密钥)。其次,一旦您决定更改序列化算法的任何部分,您将不得不关心更新那些持久化的票据。因此,为什么我们不在运行时创建新的票据,一旦验证了
2.如果我们应该保留access_token,那么应该如何加密它?盐+序列化票证上的SHA2是否能胜任,还是有更好的方法?
3.为什么要哈希刷新令牌id?它实际上保护哪些攻击?如果我们在数据库中保留真正的密钥并将哈希键作为
虽然Taiseer Joudeh有一篇非常好的关于ASP.NET Web API中OAuth授权的教程。 这是文章中的RefreshTokens表:
其中:Id - 唯一令牌标识符的哈希值,Subject - 用户名,ClientId - 应用程序标识符,ProtectedTicket - 序列化访问令牌。
我想证明或推翻SO社区做出的一些决定。 所以这里是我的担忧:
1.为什么我们要保留短期的access_token?目前我可以想到两个原因反对这种方法。首先,当您在任何地方保存用户的访问票据时,它可能是安全威胁,只等着有人抓住它们,然后重用它们对于不起疑的资源服务器(记住,他们应该使用相同的算法来序列化/反序列化密钥)。其次,一旦您决定更改序列化算法的任何部分,您将不得不关心更新那些持久化的票据。因此,为什么我们不在运行时创建新的票据,一旦验证了
client_id
和refresh_token
,而不是从数据库中读取和反序列化它们呢?2.如果我们应该保留access_token,那么应该如何加密它?盐+序列化票证上的SHA2是否能胜任,还是有更好的方法?
3.为什么要哈希刷新令牌id?它实际上保护哪些攻击?如果我们在数据库中保留真正的密钥并将哈希键作为
refresh_token
发送,那么是否会更安全?这样,对刷新令牌(猜测随机用户的刷新令牌)进行暴力攻击将不得不猜测散列算法。