2017-05-04 42 views
0

首先,我不確定在哪個Stack Exchange站點上提出這個問題,如果這是錯誤的,我表示歉意。安全 - 在設備上實時生成API密鑰

我讀了this文章,談論在您的移動應用程序中存儲API密鑰的最安全方式,其中一個感興趣的方法是在本地生成API密鑰並在服務器上具有相同功能的函數方式沒有人可以破解你的代碼,並獲得API密鑰字符串文字。這正是文章所說:

您的設備不需要存儲任何種類的密鑰,並處理保護字符串文字的所有麻煩!這是一種非常古老的技術,如遠程密鑰驗證等服務。

客戶端知道函數()返回一個鍵。 後端知道在客戶端實現的函數() 客戶端通過函數()生成一個密鑰,並將其傳遞給服務器。 服務器驗證它並繼續處理請求。 你連接點嗎?而不是有一個返回給你一個字符串(很容易識別)的本地函數,爲什麼沒有一個函數返回1到100之間的三個隨機素數的總和?還是一個以unixtime表示當前日期併爲每個不同數字添加1的函數?從設備獲取一些上下文信息(如正在使用的內存量)以提供更高程度的熵?

現在我想知道的是什麼來防止假想的黑客使用您使用相同的算法來提供有效的API密鑰?在我的腦海裏函數看起來像這樣(用JavaScript編寫):

function generateKey() { 
    var key = 0 
    for(var i=0; i<4; i++) { 
     key *= Math.floor((Math.random() * 10) + 1); 
    } 
    return key // after encrypting it with unixtime as seed, for example 
} 

請原諒,如果該功能不能正常工作或者是愚蠢的,它只是從字面上來考慮的第一件事。因此,黑客在逆向工程代碼後是否可以遵循相同的方法,並拿出服務器將標記爲有效的密鑰?

如果你想要在你的答案中發佈一個例子,可以放棄加密,因爲我只需要簡單的「概念驗證」答案。

謝謝

回答

1

沒有什麼可以防止攻擊者這樣做。如果攻擊者可以對您的應用程序進行逆向工程,他們會發現您存儲在其中的任何機密。

文章的要點是如何使假想的逆向工程師儘可能地難以真正找到你的祕密。這就是爲什麼在這篇文章中,作者正在從一種Java方法(易於分解)移植到本地方法(不像反編譯那麼容易,但可以通過他們使用的長的,看似隨機的API密鑰來識別)生成的密鑰。