我正在创建一个设计用于身份验证的ember应用程序。我真的不知道所有这些不同的令牌是如何发挥作用的。
我正在使用here描述的方法重新实现最近弃用的:token_authenticatable
设计“策略”。我想在我的API中添加令牌身份验证,并使用用户令牌将请求签名。
我想知道的是,即使它使用Devise.secure_compare
来阻止时间攻击,它仍然以纯文本格式存储authentication_token
,所以如果有人要访问数据库,那么这些令牌可能会用来偷一个会话,不是吗?
Devise似乎在模块中使用了两种不同类型的“令牌”:
Devise.friendly_token
创建令牌并将其存储为纯文本。然后通过此标记进行查找(在:rememberable
中使用)。Devise.token_generator
创建一个盐渍令牌(如:confirmable
所示)。第二种方法看起来对我来说,使用Devise.secret_key
来标记令牌,该authentication_token
是从 config / secrets.yml 中的Rails秘密派生的。这样,令牌被加密,如果数据库由于某种原因被暴露,则令牌无法使用,对吧?相当于拥有私钥(rails secret)和公钥(authentication_token)。
我有很多顾虑:
答案 0 :(得分:2)
Devise做了很多事情,并不一定是你的特定应用程序需要的东西或者应用程序需要的东西。我发现它不适合我的应用程序。缺乏对api令牌认证的支持/删除提供了足够的动力来继续并实现我需要的东西。我能够非常轻松地从头开始实现令牌身份验证。我还获得了管理用户注册/工作流程/邀请等的完全灵活性,而没有Devise所需的约束和扭曲。我仍然使用Warden,Devise也将其用于Rack中间件集成。
我提供了在another stackoverflow question上实施令牌身份验证/授权的示例。您应该能够将该代码用作令牌身份验证的起点,并实现您需要的任何其他令牌保护。我也在使用我的oAuth令牌方法与Ember.js。
还要考虑加密令牌是否只是挥手,因为根据您的部署环境以及您如何管理主密钥/秘密,它可能会给出错误的安全感。还要记住,加密说明了令牌或相关身份验证/授权信息的完整性/有效性,除非您还拥有包含访问决策中使用的所有内容的MAC /签名。因此,虽然您可能会遇到保护令牌免受可以访问您的数据库的攻击者的麻烦,但对于那些相同的攻击者来说,为数据库中的现有用户注入虚假令牌或提升权限,或者仅窃取或修改实际数据可能是微不足道的这可能是他们真正想要实现的目标!
我在门卫宝石上为所有身份验证/授权信息(代币是其中一部分)提供完整性和机密性控制方面做了一些大的评论。我建议阅读full issue以了解问题的范围和需要考虑的事项,因为目前没有任何宝石应该做什么。我已经提供了如何完全避免在服务器上存储令牌的概述,并且我提供了一些sample token generation and authentication code in a gist,它还处理基于时间的攻击。</ p>