2012-02-14 49 views
0

好了試驗了一下之後,我發現resin正在調用我的AbstractAuthenticator實現「authenticate」方法,它需要一個HttpDigestCredentials對象而不是DigestCredentials(仍然不知道什麼時候是稱爲它們中的每一個)問題是HttpDigestCredentials沒有getDigest()方法,而是它有一個getResponse()方法,它不返回散列或至少不是可比較的方法。Caucho Resin Digest Authentication with CustomAuthenticator,有人請賜教

在創建我自己的[[user:realmassword] [nonce] [method:uri]]散列之後,這個散列非常不同,實際上我認爲getResponse()不會返回摘要,但可能是服務器對瀏覽器?

任何辦法,這是我的調試日誌:

USER:user:PASSWORD:password:REALM:resin:METHOD:GET:URI/appe/appe.html:NONCE:HsJzN+j+GQD:CNONCE:b1ad4fa1ba857cac88c202e64528bc0c:CLIENTDIGEST:[[email protected]:SERVERDIGEST:I4DkRCh21YG2Mk14iTe+hg== 

,你可以看到這兩個假定客戶端隨機數是非常從服務器產生的隨機數很大的不同,實際上客戶端隨機數看起來並不像一個MD5哈希。

請問有人有此事嗎?在HttpDigestCredentials中是否有缺失?我知道摘要幾乎不被使用。

請問,我知道SSL,但我還沒有SSL證書,所以不要告訴我「你爲什麼不使用SSL」。 ;)

更新:

不知道是否是正確的事情,但是,當我讀到樹脂使用Base64格式的哈希值之前,所以我用的apache公地編解碼器1.6使用encodeBase64String()方法和現在哈希看起來很相似,但它們不一樣。

我都嘗試passwordDigest.getPasswordDigest(a1+':'+nonce+':'+a2); passwordDigest.getPasswordDigest(a1+':'+nonce+':'+ncount+':'+cnonce+':'+qop+':'+a2);

,其中沒有給出相同的散列從HttpDigestCredentials之一。

回答

0

好吧,我終於做到了。奇怪的主題啊,只有兩種觀點?首先,摘要式身份驗證使用用戶,密碼,領域,nonce,client_nonce,nonce_count,方法,qop和uri。基本上它使用完整的摘要規範。所以爲了計算哈希值,必須用所有的哨子來計算它。只需要爲來自HttpDigestCredentials的每個變量調用get方法,除了用戶和密碼。用戶將以校長的形式出現,並且您必須自己在數據庫中查找密碼(在我的情況下是DB4O數據庫)。

然後,您必須創建一個PasswordDigest對象,該對象將負責使用getPasswordDigest()方法生成散列,但首先必須將該格式設置爲帶有passwordDigestObject.setFormat(「hex」)的十六進制。

有一個用於HA1的getPasswordDigest(用戶,密碼,領域),還有另一個getPasswordDigest()方法只需要一個字符串,並且可以使用它來生成其餘的哈希值,HA2和前一個散列HA1的最後一個散列,當然還有nonce_count client_nonce和qop,當然每個都用分號隔開。

然後它來到了棘手的部分,雖然樹脂使用base64編碼的摘要,當你從HttpDigestCredentials調用getResponse()方法時,它返回一個字節數組(這很奇怪),所以爲了比較它與你的哈希什麼我做的是使用org.apache.commons.codec.binary.Hex中的Hex.encodeHexString()方法並傳遞HttpCredentialsDigest getResponse()返回值,這將給出一個很好的十六進制字符串進行比較。

我是這樣做的另一種方式,我使用PasswordDigest中的Base64哈希,並將HttpDigestCredentials哈希轉換爲Base64,結果字符串從不相同。

相關問題