2011-03-26 36 views
3

我的項目一直在嘗試使用scrypt來實現憑證檢查器。我們嘗試過實施我們自己的憑證和檢查器對象,但是我們在使用pb時遇到了很多麻煩。應該如何支持twisted.pb中的備用憑證類型?

鉛似乎硬編碼爲使用過線,這絕對不會在我們的實施工作MD5哈希值;我們沒有辦法在服務器端以純文本的形式獲取正確的密碼,因爲我們使用的是scrypt,所以我們需要一種方式來傳輸密碼,以明文形式進行驗證。我們已經嘗試過使用twisted.cred.credentials.UsernamePassword和我們的憑證檢查器,但它似乎沒有將其傳送到服務器。 (我們仍然使用_PortalAuthChallenger)

http://twistedmatrix.com/trac/ticket/4398的票證似乎表明需要一個PBServerFactory子類來支持pb中的自定義憑證檢查器,但到目前爲止,我已經完全無法弄清楚按順序覆蓋什麼以使其使用不同的ICredentials實施。是否有任何示例(甚至只是文檔)如何讓pb使用不同的憑證類?

回答

4

PB是不完全硬編碼在導線使用MD5哈希值;這只是當前實施的身份驗證協議。你可以通過實現你自己的認證協議來做任何你想做的事情 - 在PB中,它只是指你可以調用某些認證方法的對象。

使自己的對象,實現了IPBRoot,並將它傳遞給PBServerFactory。這隻意味着你需要實現一個名爲rootObject的方法,它返回特定連接的根對象(然後用Zope接口聲明該實現)。

你的IPBRoot實現應該包裝一個Portal,類似於Twisted的實現類似於_PortalRoot

然後,使一個遠程方法的對象由適合於應用程序rootObject返回;可能類似於remote_loginPlaintext。在這種方法中,你可以驗證用戶不過你想要的,然後調用login您的特定Portal與任何憑據從相互作用產生的和易於理解您的要求(和任何接口,雖然希望顯而易見的原因,IPerspective就是我建議)。

的事實,不太靈活_PortalRoot(只支持2種憑據類型; IAnonymousIUsernamePassword)被註冊爲適配器Portal,使它看起來更有點官員比它確實是。不要把它看作是「官方」PB/Cred整合機制,只是「默認」機制。

這將是巨大的,如果你能爲促進PB更靈活的身份驗證機制(可能是一個完整的SASL實現?),這樣我們就可以支持其他身份驗證類型。我希望當你的應用程序的特殊需求得到滿足時,你會考慮這樣做。

+1

看看_PortalRoot和例子,它看起來像IPBRoot實現不應該實際上被傳遞給PBServerFactory,而應該被註冊爲傳遞給PBServerFactory的適配器......這是正確的嗎? 此外,它看起來像[PBClientFactory的_cbResponse](http://twistedmatrix.com/trac/browser/trunk/twisted/spread/pb.py#L1107)被編碼以期望挑戰/挑戰者元組,並且[默認挑戰者](http://twistedmatrix.com/trac/browser/trunk/twisted/spread/pb.py#L1331)在pb中使用MD5;不需要改變? – codermonkeyfuel 2011-03-28 00:36:39

+0

1:如果'x'提供'IFoo',IFoo(x)'將總是返回'x'。因此,如果您通過直接提供商,則無需註冊適配器。 2:如果你在身份驗證方面做了一些不同的服務器端,那麼你必須做一些不同的客戶端;你需要實現你自己的東西,就像PBClientFactory。 – Glyph 2011-03-28 01:12:55

2

下面是我們想出了初步修復的鏈接:http://paste.skewedaspect.com/show/20/

注意,這需要自定義憑證可拷貝,並允許通過關鍵字ARG useMD5Challenge控制缺省的MD5密鑰交換行爲。

注意:在我們的實現中,我們將檢查完全留給Checker,並讓我們的Credential對象只包含用戶名和密碼,因此沒有實際的代碼被序列化。

相關問題