我很抱歉,如果這可能是一些常識,但我還在學習。我有一個將文件同步到網絡服務器的iOS應用程序。一旦用戶登錄設備,他將保持登錄狀態,除非他退出。目前,只要用戶發起服務器請求(例如添加,更新或刪除文件),我只會將用戶的電子郵件而不是密碼發送到服務器,因爲用戶已在設備上進行身份驗證。我應該爲每個服務器請求驗證用戶的密碼嗎?
每次發出請求時,我是否應該發送用戶的存儲密碼,並在繼續處理請求之前讓服務器對其進行身份驗證?爲什麼或者爲什麼不?
我很抱歉,如果這可能是一些常識,但我還在學習。我有一個將文件同步到網絡服務器的iOS應用程序。一旦用戶登錄設備,他將保持登錄狀態,除非他退出。目前,只要用戶發起服務器請求(例如添加,更新或刪除文件),我只會將用戶的電子郵件而不是密碼發送到服務器,因爲用戶已在設備上進行身份驗證。我應該爲每個服務器請求驗證用戶的密碼嗎?
每次發出請求時,我是否應該發送用戶的存儲密碼,並在繼續處理請求之前讓服務器對其進行身份驗證?爲什麼或者爲什麼不?
您應該發送會話標識符,而不是電子郵件地址。
會話標識符是一個很大的數字(128位是足夠的),當用戶被成功驗證時由密碼隨機數生成器選擇。它在用戶的Web設備中設置爲「cookie」,並通過安全通道(TLS)與每個請求一起發送。
電子郵件地址是公開的。您只能使用密碼來驗證請求,例如密碼或會話標識符。
我不是專家,但直到你在這裏得到更好的答案是一些提示:
如果您使用的是HTTPS,那麼您可能無需擔心太多。如果它是未加密的流量,那麼您可能希望使用額外的散列值對每條消息進行「簽名」。
使用電子郵件地址標識用戶意味着某人可能會使用現有的用戶電子郵件地址僞造您的服務的訪問權限。正如Kristopher Johnson所建議的那樣,使用會話標識符可以避免公開證書,並且可能是一個很好的設計選擇。
在OWASP的好人有一個session management cheat sheet這是一個很好的起點,任何設計。
如果有可用的話,他們建議使用現有的會話管理框架(Java EE,ASP.NET,PHP)。
如果您要通過SSL,那麼每個請求都發送用戶名和密碼是最好的。爲什麼?因爲它更簡單的編程接口,因爲令牌不會增加真正的價值。在某些情況下,要獲取令牌,您必須發送證書,因此,如果您每次都發送證書,那麼它有什麼關係?沒有人可以在適合時間的情況下解密SSL。現在,Web服務器本身可能存在其他安全漏洞,但與從客戶端到服務器的傳輸無關(受保護)。因此,用戶/傳遞每個請求是最好的。
而且因爲它的iOS應用程序,你可以存儲在NSUserDefaults的憑證(這是沙箱到您的特定應用程序,並沒有其他的應用程序可以訪問它)
請了投票,並接受,其他的答案是誤導
現在,如果它不是一個iOS應用程序,並且您必須將憑據存儲在cookie中而不是NSUserDefaults中,那麼確定,也許您可以使用會話的參數。但除此之外,不值得頭疼!
因此,每個用戶都有一個一次生成的會話標識符?這種類似於服務器請求的唯一ID嗎?它是隨每個請求而改變,還是它是一個生命期標識符?密碼散列怎麼樣?我可以用它來代替嗎? – Snowman
您每次登錄時都會生成一個新的會話標識符。不確定您用於服務器的是什麼,但大多數會自動爲您執行此操作。關鍵在於,如果服務器在用戶登錄之前生成會話ID cookie *,並且通過不安全的渠道將該cookie發送出去,則必須使會話無效並在登錄時創建一個新的cookie。所有經過身份驗證的請求必須通過HTTPS執行。 – erickson
因此,例如Facebook的iOS應用程序..用戶通常會保持登錄數月。他們會怎麼做?無論用戶登錄多少個月,他們都會使用相同的會話ID?他們是否發送電子郵件或密碼?他們如何查找用戶? – Snowman