2016-07-05 69 views
1

我們有一項服務,用戶可以註冊。此流程受reCAPTCHA保護,以防止自動註冊。問題是,在移動設備上,reCAPTCHA並不方便。因此我們決定註冊API也會接受一些特殊的令牌而不是reCAPTCHA響應。移動設備上的驗證碼替換

現在的問題是如何實現這個令牌。我們的第一種方法是爲移動應用程序提供一些不變的祕密,這些祕密將作爲令牌發送到服務器。但是,如果黑客將請求重定向到他的服務器(通過更新API域的DNS記錄並將他的證書安裝爲受信任的移動設備),則可以揭示此祕密。

現在我們最後的方法是在用戶名+密碼上計算令牌爲HMAC-SHA1(我們是否需要在這裏分割 - 也許只是爲了使輸入足夠長?)。用戶名將從註冊輸入中獲取。然後服務器將通過驗證散列來授權它。在他的情況下,可能會進行重播攻擊,但這是可以的,因爲重複的用戶名將被拒絕。

這種方法是否正確?也許在移動設備上還有其他替代方案可用於驗證碼?

也可以從iOS(ipa文件)中獲取和逆向工程應用程序,因爲它將託管在Appstore中並提取密鑰(和祕密)?

在android的情況下,這是可能的 - 有沒有辦法來防止它?

回答

0

我們決定與Hawk一起去不通過電線發送憑據。它將用於iOS,因爲它不應該對應用程序進行逆向工程並獲得密鑰。對於Android,我們將使用Android的一些reCAPTCHA庫。

0

您發現了缺點:您仍然使用不會爲同一用戶更改的令牌。在你的用例(註冊)中沒問題,但是可能會有另一個用例不起作用(例如密碼恢復功能)。在這種情況下,可能的黑客可能會爲任何用戶生成有效令牌,這是您要求的用戶名)。

我的解決辦法是:

  • 創建的算法(在兩個移動應用程序和後端),其採用了「公共標誌」,並創建了一個「祕密令牌」,解決了驗證碼。它可能是一個簡單的SHA1哈希(我不推薦),公共令牌和鹽之間的組合,用戶ID和公共令牌等等。
  • 在您的API上創建一個端點,生成公共和祕密令牌。將祕密令牌存儲在您的後端並將公共令牌返回給客戶端(移動應用程序)。
  • 然後,您的應用程序應該詢問公共令牌,生成祕密令牌並將其發送到API。該API驗證祕密令牌已經存儲在您的數據庫中,如果是這種情況,那麼captcha就解決了。

一個改進將使存儲的祕密標記在X秒後過期。

希望它有幫助!