我正在实施用于API身份验证的两条腿OAuth协议的提供程序端。我们将向消费者提供消费者密钥和秘密,他们将使用这些密钥和密钥来签署请求。两条腿OAuth由互操作性标准决定,因此是一项要求。
秘密类似于密码,我通常不会将密码存储为纯文本(bCrypt或类似密码将是我的正常选择)。但是因为我的提供者需要访问纯文本秘密来验证签名,所以它必须是一些纯文本或可逆形式。
我考虑过以下选项:
这是最明显的解决方案,但如果数据库以某种方式受到损害,那么所有的秘密都必须改变。对我来说,这个解决方案并不理想,因为它存在以纯文本形式存储密码的所有问题。
这将提供一些安全性,因为如果数据库被泄露,那么秘密仍然是安全的。但是可逆加密需要加密密钥,密钥必须存储在服务器上。这意味着如果攻击者破坏了计算机,则可以规避加密。
有没有我想过的东西?
澄清实际上,它使用双腿Oauth作为单点登录系统。 'consumer'创建一个请求,包括使用者密钥,nonce和其他几个参数。然后通过计算具有消费者秘密的HMAC-SHA1来签署整个请求。当请求到达我们的提供者系统时,重复该过程,如果签名匹配,则继续请求处理。因此,我们需要明文秘密来计算我们方面的HMAC-SHA1签名。不幸的是,这种机制是由我们需要遵守的行业标准协议决定的。
答案 0 :(得分:2)
看看this previous question。我不是这方面的专家,但我认为你错过了这个方程式的一部分。除了使用者密钥和密钥之外,您还将验证发送请求的应用程序(如果您使用的是RSA-SHA1,则使用x509证书)。
答案 1 :(得分:0)
您确定提供商需要明文密码吗?
如果是这种情况,那么您根本就不能拥有'客户机密'。一旦客户向其他人(包括您)披露这个秘密,它就不会再成为秘密了。
也许如果你解释了你想要做的更多,我们可以提出一个更优雅的appraoch。