2012-04-24 101 views
0

我計劃對服務器和客戶端(這是一款移動應用程序)之間的通信使用一次性密碼加入。但我需要在移動應用程序中對關鍵字進行硬編碼。因此,不同用戶安裝的所有移動應用都具有相同的密鑰。我是否應該在我的iOS或Android應用程序中硬編碼存儲加密密鑰

對Android和iOS構建進行反向工程並簡化硬編碼值有多簡單?

關於安全性的一些其他信息我計劃: 我還計劃通過向每個用戶發送一個帶有4位數字的短信來添加額外的安全性,這將用於簽署請求。這樣我可以保證用戶是誰假裝是。

我通過互聯網發送用戶的位置,他的電話號碼(一次),他的名字(一次)。

你怎麼看待我的ideea,你會推薦什麼?

回答

0

多麼容易反向工程的構建Android和iOS和 extrat硬編碼的價值?

很簡單。

發送每個用戶短信與將用於登錄請求

實在是太複雜了用戶和一個4位數字,應該只是如果真的有必要(爲具有較強的安全應用要求)

首先:使用SSL加密連接(HTTPS)。

另外,您還可以爲每個連接從服務器獲取密鑰和sessionId。服務器會將sessionIds和密鑰存儲在某個存儲中...

1

您的設計中有許多安全漏洞。嚴重的是,只需使用基本身份驗證的SSL。這是戰鬥測試和綽綽有餘你描述的用例。

1

一般來說,如果你要問有關在生產代碼設計自己的加密方案的問題,你不應該在生產代碼設計自己的加密方案(和你應該永遠代碼一次性密碼到一個應用程序,因爲這意味着它被用於多次)。

雙因素身份驗證很好,但您使用的實際加密應該是衆所周知的。如果您想要在應用中嵌入某種密鑰,您可能需要查看公鑰密碼系統,如RSA。像SSL這樣的加密套件可能是在這裏使用的合適系統。

-1

如果它以二進制格式保存在純文本中,很容易從應用程序中提取加密密鑰。您需要將密鑰隱藏在代碼中或其他文件中。例如,如果將字符串隱藏在代碼中,而不是像@ @「我的密鑰」那樣進行操作,則可以使用某種非標準方式構建字符串,可能會存儲10個字符串,然後從每個字符中選擇一個字母,將它們連接在一起形成您的實際密鑰。

另一種方法是將密鑰隱藏在另一個文件中,比如圖像。如果您可以選擇加密密鑰,請從您在應用程序中使用的圖像中挑選一組特定的字節。

+0

爲什麼downvote?自從問了這個問題已經過去了一年多了,還沒有更好的解決方案呢?在某些情況下,您需要在應用中存儲公用密鑰,此方法可以工作,並且比大多數其他方法更安全。如果你打算陷入低谷,至少會提供更好的解決方案...... – 2013-05-17 16:21:55

+0

我投下了它,因爲它沒有解決更大的問題:滾動你自己的密碼是你能做的最糟糕的事情之一。 – 2013-07-18 23:43:35

0

在iOS上,您可以將鑰匙存儲在鑰匙串中。

但是,我不太確定你的每個人的戰略的唯一關鍵。您是不是可以使用用戶名和密碼(或針對該問題的SMS身份驗證)來驗證您的用戶,併爲其生成唯一的用戶密鑰。您可以將此密鑰存儲在鑰匙串中供將來參考。

並使用安全連接! (?HTTPS)

1

僅供參考,這是非常容易反向工程了從iOS或Android的硬編碼值,以不同的方式:

  1. 靜態分析:使用靜態分析工具,如IDA Pro揭示了關於二進制的豐富信息。同樣,標準* NIX命令strings顯示了二進制文件中包含的每個字符串。運行時分析和調試:GDB等工具可以顯示應用運行時的內部情況,允許用戶設置斷點,讀/寫寄存器和數據位置,或者在程序中進行挖掘。

  2. 網絡代理:簡單地通過指定在系統設置應用程序來掛在同一本地網絡膝上型網絡代理將允許筆記本,查看該設備發送到和從服務器接收的一切。除非此數據在發送之前或接收之後被加密,否則用戶將能夠確定密鑰是什麼。

主要的事情要記住的是:無論你做什麼,試圖隱藏從用戶的關鍵,只要有足夠的時間和精力,他們將能夠弄明白。

0

這裏有一個高層次的建議:

1) If (keychain is empty) generate a random password, perhaps with base64 encoding 
    If (keychain is not empty) you must have already generated a password from one of your apps, so just use the one in the keychain. 
2) If from 1) (keychain is empty) store that new random password in the keychain 
相關問題