2014-03-07 50 views
0

我想做一個基於表單的身份驗證。 我應該用公鑰/私鑰簽名基於表單的身份驗證(沒有SSL)嗎?我應該用公鑰/私鑰簽名基於表單的身份驗證(無SSL)嗎?

我知道它不會避免中間人攻擊,但至少它會保護密碼的價值,如果我將其隱藏在簽名中。

簽名表單身份驗證無效嗎?沒有SSL進行身份驗證的最佳方式是什麼?

不要像Heroku的地方免費提供SSL?我只是玩弄和努力學習很酷的東西,不想支付:(

[更新]: 在經歷一個非常簡潔的方式,我想談談,並保持與最低限度的安全簡單的HTTP會話我該怎麼辦呢?主要的要求是,以避免未經驗證的用戶從做請求的REST API可能改變服務器上的東西。

回答

1

假設您擁有客戶端和服務器,因此可以在它們之間共享一個祕密(即一定數量的隨機字節),並且儘管存在保密祕密的問題,但假設您正在使用REST使得HTTP請求參數在URL中而不在主體中:

  • 創建共享密鑰。我們將這個稱爲K.例如,生成128個隨機位:

    dd if =/dev/random bs = 16 count = 1 | OD -t X1

    (128位必要/充分您的要求取決於...?)

  • 每個請求:

    • 生成隨機數N.這可以是:

      • 一個隨機數。
      • 時間戳記:從時代開始秒/時間窗口大小 我們將回到時間窗口大小。
    • 添加所述隨機數作爲一個請求參數:

      http://foo.com/blah/[email protected]=dismal?N=0x123456789abcdef

    • 計算包含字符串S:

      • 的HTTP方法,例如GET,POST。
      • 完整的網址。
    • 計算的HMAC其中:

      • K是密鑰
      • 文本(即東西是HMACed)是S.
    • 追加HMAC作爲請求的參數。

  • 在服務器上:

    • 地帶HMAC從請求。

    • 從請求中提取N.

    • 驗證N(見下文)。

    • 如上計算S。

    • 查找客戶的K.

    • 計算HMAC如上。

    • 將計算出的HMAC與請求中的HMAC進行比較。

這意味着:

  • 我必須知道K可發送請求。
  • 攻擊者無法修改正在運行的請求URL,因爲這會使HMAC失效。

但是,觀察者可以捕獲並重放請求。這也正是現時進來:

  • 如果您使用基於時間的隨機數,然後

    • 的請求可以在時間窗口內進行重播。
    • 時間窗口必須足夠大以適應客戶端和服務器之間的時鐘差異以及網絡延遲。
    • 「驗證」表示服務器必須檢查時間戳以確保它「現在」。
  • 如果您使用隨機隨機數,那麼服務器必須記住歷史隨機數並拒絕任何具有先前看到的隨機數的新請求。

  • 更好:使用時間窗口和/或隨機數字。服務器然後只記住當前時間窗口內的隨機數。

當然,這需要同步時鐘和隨機數的體面來源,不提供保密......

+0

謝謝:) 這是一個非常好的答案,它留下了很多東西供我學習和學習一點點。 我知道我沒有足夠具體,我會試着在下一個問題上更具體;) – doart3

1

我認爲你基本上是問如何證明一個共享的知識祕密(即用戶名/密碼)發送到服務器通過未加密的HTTP連接

基本規則1:不推出自己的密碼[G raphic protocols]:如果你需要保密和完整(即加密和身份驗證等),然後使用TLS/SSL,除非您的智能/知識豐富/經驗足以自己完成。

基本規則2:不枚舉算法/技術(如公共密鑰加密),並詢問他們是否會解決你的問題,如果不瞭解您的安全要求。加密算法提供了諸如機密性等安全屬性。根據某些此類屬性,安全要求最終(根據一些分析)。因此,適當的技術從安全需求/分析工作中退出,而不是相反。

回答你的直接問題:不,因爲你剛剛用另一個祕密取代了一個祕密(因此沒有解決你的問題),沒有考慮重播攻擊,也沒有考慮到混亂的代表和連接劫持等事情。

如果您仍想推出自己的產品,請首先確定您的安全要求:您正嘗試向服務器驗證客戶端(即瀏覽器),但服務器是否必須向客戶端證明其身份? 爲什麼是您的身份驗證?如果要授予對特定信息的訪問權限,那麼爲什麼您會立即以明確的身份通過身份驗證發送該信息? (MITM與被動觀察者不同。)做一些威脅建模。假設你沒有問題,你最終可能會發明一些看起來像HMAC的時間或服務器端狀態,以防止重放。儘管如此,你仍然有分享祕密或同意可信第三方的問題。

+0

謝謝:) 這些都是很好的2個有章可循,我也得到你的觀點,你是對的。 我想做一個愛好項目的簡單登錄,所以我不想支付任何SSL證書。同時,通過帖子發送明確的密碼沒有什麼意義,我怎麼能避免這種情況。 以一種非常簡潔的方式,我想通過HTTP以最小的安全性啓動並維護一個簡單的會話。我怎樣才能做到這一點? 主要要求是避免未經身份驗證的用戶向REST API發出請求,這可能會改變服務器上的某些內容。 – doart3