2012-05-15 121 views
5

我在一個開源的JavaScript應用程序我試圖與第三方API接口工作密鑰(特別是GitHub的)。我試圖只保留我的整個應用程序客戶端,所以我真的不會有服務器回退或存儲隱藏的文件。作爲OAuth流程的一部分,我需要提供爲我的api密鑰提供的密鑰。我不應該發佈或分享這個密鑰。隱藏在公共倉庫

我想出了以下解決方案:

  1. 加密密鑰利用三重DES和密碼。
  2. 將加密版本放到我的資源庫中。
  3. 當我需要通過Oauth進行身份驗證時,提示輸入密碼並恢復密鑰。
  4. 一旦知道,在本地存儲中存儲祕密,以避免未來的提示。

我基本上是個存儲密鑰的轉換後的版本。我想所有這些買我的是,我必須從用戶而不是完整的密鑰獲得密碼。它應該比隨機字節更容易記住。

這樣安全嗎?這不是一個超級重要的應用程序,但我想盡我所能保護我被告知不要共享的內容。有沒有比3DES更好的方式來以可逆方式加密密鑰?

+0

結果無論如何,客戶端OAuth並不真正被github支持。他們不希望顯示密鑰。如果處理不太挑剔的apis,可能仍然有用。 – captncraig

+0

我不太瞭解這種情況。你是否試圖隱藏用戶的github密鑰,即使他們正在運行使用密鑰的客戶端?如果是這樣,你不能安全地做到這一點。確定的用戶將始終能夠恢復該密鑰,並且從道德的角度來看,您不應該試圖隱藏存儲在其所有者機器上的信息。如果每個用戶都有自己的github密鑰,並且您只是在尋找一種更方便的方式來記住它,那麼您的解決方案就很好。 – erickson

回答

2

這聽起來足以保守一些祕密;雖然Triple DES有點過時了。

我會用X輪SHA-256散列的口令,然後使用該哈希值作爲AES-256密鑰。

+0

或者只是使用像[SJCL](https://crypto.stanford.edu/sjcl/)這樣的庫,它提供了一種像您所呈現的那樣工作的算法。當談到密碼學時,自己實施某些事情通常會導致安全問題。 – Robert

+1

不要只是使用SHA-256,使用精心設計和審查的真正的密鑰派生算法(如PBKDF2)。例如,密鑰派生應該使用salt。 – erickson

5

這種解決方案的問題是,應用程序必須包含代碼(以及可能的密鑰)來解密它。最好的解決方案是根本不放入存儲庫。

大多數應用商店這種類型多數民衆贊成通過版本控制軟件忽略了在配置文件中的數據。然後用一個假密鑰包含一個示例配置文件,並說明如何重命名文件並獲取他們自己的api密鑰。

的一個很好的例子是在wordpress's config file「認證唯一鍵和鹽。」部分。

+0

當在github頁面上託管時,存儲庫就是部署。沒有辦法將兩者分開。 – captncraig

+0

多數民衆贊成在一個有趣的問題,我想沒有什麼好方法來保護key.That意味着你留下緩解。爲此應用程序保留一個單獨的密鑰。如果它被破壞,你可以放棄它而不影響其他應用程序。 – AaronAsAChimp