2011-09-08 68 views
0

在我的遊戲應用程序中,從iPhone/iPad運行到通過TCP控制的中央服務器,我需要發送登錄信息。如何加密通過TCP傳輸的密碼?

我目前所做的是發送一個登錄操作碼和ascii字節登錄和密碼在明確。我不想在明文中發送用戶密碼 - 例如,他們可能在無線連接上。

我該如何處理加密?下面是我的要求:

  • 我不希望使用第三方lib下,我會在絕對必要的。如果必要的話它必須BSD許可證或類似
  • 什麼是我的回答「是」上「你的應用程序有加密在它」在App Store中
    • 我想這個應用程序是在每一個國家的影響
  • 在本地設備上散列密碼並僅發送緩存值是否可以接受?用戶的帳戶可能會被哈希被盜用,但密碼不會丟失(並且我不會存儲他們的密碼)..
  • 我不能有某種OAuth out-of-the -app安裝系統完成,因爲我以前經歷過,它太侵入

我在這裏有點不知所措。我非常感謝這裏的任何幫助,因爲這是我在結束近一年的開發之前需要解決的最後3件事情之一..(所以這不是理論上的或過早的優化!它已經成長爲一個實際問題..)

+0

你看着像[RSA]一種公共密鑰加密的(http://en.wikipedia.org/wiki/RSA)?或者,如果您願意將密鑰保存在客戶端中,那麼[AES](http://en.wikipedia.org/wiki/Advanced_Encryption_Standard)如何?存在預構建的庫,但您可以自己實現這些方法 - 它們的規範是公有領域。 – ShaneC

+0

安全傳輸層或不安全,絕不需要存儲明文密碼或通過電線發送。做一些閱讀。 :) – bzlm

回答

4

首先,強制性規定:「不要發明自己的密碼方案,如果你不是專家,你會做錯的,如果你是專家,你會以創造性的方式做錯可怕的破碎,但哪個破碎將是隱形的,直到你的方案被數千人使用「

接下來,清楚你想要保護什麼,以及爲什麼。你提到明文用戶密碼由於某種原因而不好。您是否擔心用戶在一堆地方使用的密碼會被應用程序泄漏,危及用戶的其他帳戶,或者您更擔心攻擊者能夠訪問您的用戶帳戶?

我對你在散列思想的潛臺詞中讀到的問題的關注是,客戶端發送的散列不會改變(除非密碼改變)。這使得它成爲認證的明文等價物(攻擊者只需要竊取散列;然後他們可以在不知道密碼的情況下進行認證)。這也使得密碼更容易受到可以看到散列的人的暴力攻擊的影響。

由於擔心會限制應用程序的可用性,我得到了一個您希望避免加密的印象。我能理解這個理由。

假設密碼安全哈希不是密碼學(我不知道它是否是,但它不是根據美國出口限制據我所知)。我的建議是用一個非常簡單的質詢 - 響應協議來驗證用戶是否有密碼(我建議你在線查看「質詢 - 響應協議」)。

這裏需要注意的一點是,我沒有解決首先獲取密碼的問題;只是服務器驗證用戶是否擁有該帳戶的正確密碼。這個作爲一個如何防止事情像重放攻擊一個總體思路,使攻擊者能夠看到的數據流的生活更加艱難:

客戶:「我希望約翰·史密斯的身份驗證」

服務器:「好的'約翰史密斯'聲稱的人,採取當前的日期和時間(2011-09-09 @ 12:04:33AM)和我想到的一個隨機數字:4bazillion,並用你的密碼散列它們。讓我知道你得到了什麼。「

客戶:

  • 提示用戶輸入密碼
  • 哈希
  • 說: 「我得到了。gaAGRtcq4qt22332」

服務器:

  • 說:

    • 需要的日期和時間以及隨機數與密碼
    • 哈希如果有匹配的客戶端計算的數據
    • 比較數據: 「好的,你進來了。」
  • 否則:
    • 說: 「去一斤沙。」
+1

這是一個版本,與您的第一段有關:[SRP](http://en.wikipedia.org/wiki/Secure_remote_password_protocol) –

+0

嗨,好評,謝謝!我實際上已經考慮過你描述的方法,並理解重播攻擊問題。事實上,我用這個作爲我的協議的另一部分。但是我沒有辦法首先得到服務器的密碼,而沒有做我不想做的事情 - 在這裏我可以做的最接近最好的事情就是創建帳戶時打開一些https,使得用密碼帳戶,然後用我的協議登錄。解決它,但有點糟糕 – Nektarios

2

TLS/SSL。只要使用它。它內置於iOS中。

至於加密,是的,你需要聲稱你使用加密,這將需要你從政府獲得(簡單)在線註冊證書。

+0

服務器怎麼樣 - 哪個不是iOS顯然(它是FreeBSD) - 我應該使用iOS上的哪些API以及我應該在服務器上使用哪個庫,以及這裏的概念是什麼 - 服務器爲每個連接生成一個證書? – Nektarios

+0

原始庫:OpenSSL,PolarSSL等預先裝好的:Apache與mod_ssl –

+0

如果只使用內置在iOS中的TLS庫,你是否真的必須說它使用加密? –

2

通過HTTP驗證您的服務。您不需要使用任何第三方庫。您可以將其實現爲帖子或獲取。