2011-11-08 14 views
0

我和我的團隊正在開發一個API /中間件系統,該系統將要求所有向中間件層提出的請求都使用公鑰和私鑰簽名以確保安全。這些請求中的大部分都將成爲服務器到服務器,但移動應用程序(例如iPhone和Android應用程序)將直接從中間件查詢數據。API /中間件身份驗證通信 - 請求完整性檢查

我們已經實現了我們的簽名庫,它非常接近地反映了亞馬遜市場API使用排序後的查詢字符串工作的方式,並使用公鑰和私鑰對HMAC 256散列進行散列,以生成使用相同算法進行比較的簽名。

不幸的是,我們剛剛瞭解到(爲了通過應用商店發佈iPhone應用程序,您必須符合某些政府標準才能實現加密庫(讀取爲導出限制))。現在我們不得不決定是否應該重新編寫我們的簽名算法,以便使用更簡單的方法,例如將私鑰添加到查詢字符串中,並使用SHA1()對其進行哈希以進行比較。我注意到一個高度安全的方法,並將它減少到僅用一個私鑰進行哈希處理,但我對安全性和加密技術不夠熟悉,不知道在長時間內丟失HMAC 256會導致什麼損失。 :查詢字符串已經包含了公共密鑰)

例如,我們現在訂購我們的查詢字符串,這樣的執行操作上簽字:

$signature = base64_encode(hash_hmac('sha256', $querystring, $private_key, TRUE)); 

如果我們被迫不使用加密類在我們的應用程序中,我們的簽名將如下所示:

$signature = base64_encode(sha1($querystring . $private_key)); 

從技術上講,我們可能會滿足在我們的應用程序中使用該庫的標準,但是如果美國政府認爲我們所做的並不完全符合,我不知道是否要冒風險的法律後果他們對'認證'的法律描述。

任何和你的安全大師的建議非常感謝!我通過使用第二個代碼示例失去了什麼,它是否會讓我們的中間件更容易被盜用?

+0

hmac 256不是一種加密方法。另外,消息摘要功能不是加密功能。他們不可能更加不同。 – rook

+0

謝謝Rook。原諒我濫用術語,我承認對安全術語不太熟悉(這就是我問這個問題的原因)。考慮到我正在努力實現的精神,考慮到我的最終目標是在接收端進行數據完整性檢查,您是否看到兩種實現方式的巨大差異? – Shane

+0

我會stil使用hash_hmac函數只是傳遞'sha1'作爲第一個參數。 hmac不僅僅是一個直接的連接,這使得hmacs有趣的屬性,比如它們不受衝突的影響,即使下劃線散列函數是脆弱的。在這種情況下,sha1對於碰撞是可持續的,但這不會影響到你。此外這個問題更適合加密堆棧交換。 – rook

回答

0

如果有其他人出現類似的情況,至少在我們的情況下,我們正在使用的加密方法(如上所述)確實符合法律要求並適用於Apple ToS。我們基本上實現了一個亞馬遜AWS風格的認證,但事後來看,OAuth 1.0只是一個稍微強大一點的方法,預先構建的庫可以幫助您實現。

如果您今天在應用程序中執行此類型的身份驗證,我肯定會建議查看OAuth。