3

我的项目一直在尝试使用scrypt实现凭据检查器。我们已经尝试实现我们自己的凭证和检查器对象,但是我们在让 pb 使用它们时遇到了很多麻烦。

Pb 似乎被硬编码为通过网络使用 MD5 哈希,这在我们的实现中绝对行不通;我们没有办法在服务器端以明文形式获取正确的密码,因为我们使用的是 scrypt,所以我们需要一种方法来传输密码以明文形式进行验证。我们已经尝试将twisted.cred.credentials.UsernamePassword 与我们的凭证检查器一起使用,但它似乎并没有进入服务器。(我们仍然得到 _PortalAuthChallenge 代替)

http://twistedmatrix.com/trac/ticket/4398的票证似乎表明需要 PBServerFactory 子类才能支持 pb 中的自定义凭据检查器,但到目前为止,我完全无法弄清楚要覆盖什么为了使它使用不同的 ICredentials 实现。有没有关于如何让 pb 使用不同的凭证类的示例(甚至只是文档)?

4

2 回答 2

4

PB 并没有完全硬编码以通过网络使用 MD5 哈希;这只是当前实现的身份验证协议。通过实现自己的身份验证协议,您几乎可以做任何您想做的事情——在 PB 中,这只是意味着您可以调用一些身份验证方法的对象。

制作自己的实现对象IPBRoot,并将其传递给PBServerFactory. 这只是意味着您需要实现一个称为rootObject返回特定连接的根对象的方法(当然,然后使用 Zope 接口声明该实现)。

你的IPBRoot实现应该包含一个Portal,类似于_PortalRootTwisted 的实现。

rootObject然后,对从适合您的应用程序返回的对象创建一个远程方法;也许像remote_loginPlaintext. 在这种方法中,您可以根据需要对用户进行身份验证,然后使用从该交互中派生的任何凭据调用login您的特定用户Portal,并对您的要求有意义(以及任何接口,尽管出于显而易见的原因,但IPerspective我建议这样做)。

事实上,有些不灵活_PortalRoot(仅支持 2 种凭证类型;IAnonymousIUsernamePassword)被注册为 的适配器Portal,这使它看起来比实际更正式一些。不要认为它是“官方”的 PB/Cred 集成机制,只是“默认”机制。

如果您可以为 PB 提供更灵活的身份验证机制(可能是完整的 SASL 实现?),这样我们就可以支持其他身份验证类型,那就太好了。我希望当您的应用程序的特定需求得到满足时,您会考虑这样做。

于 2011-03-27T03:45:41.187 回答
2

这是我们提出的初步修复的链接:http: //paste.skewedaspect.com/show/20/

请注意,这要求自定义凭证是可复制的,并允许默认的 MD5 密钥交换行为由关键字 arg useMD5Challenge 控制。

注意:在我们的实现中,我们将检查完全留给 Checker,并且我们的 Credential 对象只包含用户名和密码,因此没有实际的代码被序列化。

于 2011-04-06T16:58:46.253 回答