2009-12-22 105 views
2

我正在努力的目標是成爲一種安全的用戶註冊和身份驗證方法,使用php和javascript而不是ssl/tls。有沒有辦法在客戶端驗證javascript文件的完整性?

我意識到這可能被認爲是一個不可能完成的任務,之前已經嘗試過1000次,但我仍然會放棄它。我在網上看到的每一個聲稱這樣做的例子似乎都有一些巨大的致命缺陷!

無論如何,我目前的問題是在客戶端驗證JavaScript。問題是,如果我的sha1在JavaScript中的實現被一些中間人修改,那麼它根本就不安全。如果我可以驗證收到的JavaScript沒有被篡改,那麼我想我可以把它關閉。

但真正的問題是,在客戶端做事情的唯一方法是javascript。簡單:寫一個JavaScript來驗證其他JavaScript文件的完整性。不!中間人可以修改這個文件。

有沒有辦法解決這個問題?

回答

2

爲了確保您的JavaScript安全,您必須在保證未受到篡改的環境下對其進行檢查。既然你不能在瀏覽器中創建這樣的環境,這是不可能的。您最好的選擇是通過HTTPS下載JavaScript。這並不安全,但更好。可能的攻擊向量左:

  • 病毒可以修改瀏覽器加載一些惡意的JavaScript的每一頁
  • 按鍵記錄軟件可以監控用戶正在輸入
  • 代理可作爲行動人 - 在 - HTTPS連接的中間。代理將實際解碼您通過HTTPS發送的內容,並再次對瀏覽器進行編碼(使用不同的證書)。
  • 代理可以添加的iframe頁面發送
+0

如果我要使用https,我會使用它的整個過程而不僅僅是JavaScript。除非有一家公司會爲我的https服務我的javascript。對於病毒,鍵盤記錄器, ;沒有什麼可以做的! 通過代理你是指一個真正的代理服務器或惡意中間人? – Matthew 2009-12-22 11:34:25

+0

@Matt:兩者。一些公司配置他們的代理來解碼流,以便他們可以檢查HTML是否存在病毒,木馬等。 – 2009-12-22 12:43:24

+1

或訪問禁止網站,如playboy.com上的OSS下載頁面。 – 2009-12-22 12:43:55

0

因爲它們在客戶端中,所以無法訪問它們。

這是網頁的性質......

嘗試使用重要的事情在服務器端...

1

有沒有辦法解決它。正如你所說:如果你無法驗證源代碼,中間人攻擊者可以用代替客戶端收到的任何東西,即客戶端解釋和執行的任何東西。

0

如果您的安全體系結構在某種程度上需要的功能在JavaScript中運行,那麼你的安全是有缺陷的。

+0

我確實看到你來自哪裏,但如果你能確保javascript沒有被篡改,那爲什麼不呢? – Matthew 2010-01-04 00:52:25

1

你說你唯一的問題是中間的人修改你用來執行SHA1的JavaScript。因此,我猜你正在使用用戶名+密碼SHA1的登錄....

即使沒有JavaScript篡改,這是完全不安全。即使中間的人可能不知道簡單的密碼,如果JavaScript沒有被修改,他會知道散列,並且他可以完全使用該散列通過僅僅重放它來執行自己的登錄。

即使包含salt/nonce,中間的人仍然可以使用這些令牌,甚至通過執行密碼/電子郵件更改來竊取帳戶。

即使忽略這一點,並假設你可以真正解決所有這些+實際上得到一個JavaScript來測試第二個JavaScript的完整性,你會如何防止「驗證腳本」被篡改呢?您需要依賴通過不安全通道發送的腳本來確保這些數據的安全性(並且可以遞歸地繼續執行腳本,檢查腳本的完整性以檢查腳本的完整性......),所有腳本都被完全篡改因爲它們是通過不安全的通道發送的。

要做到這一點的唯一方法是能夠建立一個自己的安全通道上的http,這將需要一些客戶端額外(Firefox插件/ ActiveX擴展),但本機支持https這只是荒謬的。

+0

我同意這不是一個理想的情況;我只是在探索可能性。安全性比可部署系統更多。 關於你的第4段(「甚至忽略這個...」),整個遞歸驗證檢查就是我所問的。我明確表示,我意識到這個問題,並問是否有解決方法。顯然不是現在。 – Matthew 2009-12-23 00:53:44

+0

使用瀏覽器插件/擴展程序在本練習的規則中也不是「允許的」。是的,這裏的想法是通過http擁有某種安全通道,只是爲了查看沒有https的情況下可能會發生什麼。 – Matthew 2009-12-23 00:55:17

0

使用JavaScript,您可以防止被動網絡攻擊(如竊聽WiFi流量),但您無法保護自己免受入侵者能夠控制HTTP響應標頭和正文數據的主動網絡攻擊。

如果您不想支付SSL證書費用,則可以改爲創建自簽名證書。但是,這隻會阻止被動網絡攻擊,但比您創建的某些hacky JavaScript實現容易得多。

本質上,您需要一個CA簽名的SSL證書來防止主動網絡攻擊(中間是一名男子)。

2

馬特 我相信(儘管反對者)認爲你所要求的並不是不可能的,只是非常困難。你所問的是,完全可以被濫用的代碼允許用戶向服務器標識自己,反之亦然。一種可能的方法是使用零知識證明,它不會向竊聽者(Eve)泄漏信息。例如,服務器可能提供的javascript描繪了一個圖表,該圖表將自己提供的沒有價值的信息與其自身的服務器提供的信息組合在一起,也沒有價值。 javascript可能已被修改,但是無法提供正確的圖形(此時用戶WALKS AWAY)或成功。在後一種情況下,用戶同樣提供「零知識」的證據表明它們具有圖的同構表示;再次,這要麼成功要麼失敗。也看SRP協議,但問題在於它是一個專利雷區。請參閱弗格森和施奈爾的實用密碼學。 Jo

+0

你能否詳細解釋一下?我瞭解零知識證明的想法,但繪製圖表是什麼? – Matthew 2010-01-04 00:50:18

0

當且僅當服務器和客戶端先前共享祕密時,才能驗證客戶端JavaScript文件的完整性。在互聯網上通常不是這種情況。如果這樣的祕密不可用,那麼任何嘗試驗證轉移的Javascript都可能被破壞。這是一個捕捉22的情況。

大多數情況下,人們都希望確保JS的完整性,因爲它使他們覺得自己可以委託客戶端的安全檢查。在密碼學中,有一條不應該被破壞的基本規則:永遠不要信任遠程用戶輸入。始終仔細檢查。

SSL/TLS可以使中間人攻擊難以實現,但它不是水密的。

相關問題