2010-10-28 112 views
1

我在我的應用程序中有一個開放的API,我想提供訪問密鑰。傳入的信息將是用戶ID,資源ID和要更新的值。我希望每個資源都有一個API密鑰。創建加密API密鑰的最佳方法

優選我想能夠驗證僅使用所提供的數據,而不是檢查對任何形式的數據庫的傳入請求的真實性(非常簡單,非常快!)

如果我使用MD5生成從資源ID,用戶ID和鹽它可能看起來像這樣的API密鑰...

authentic_request = md5(user_id + resource_id + salt) == api_key 

我的問題真的是一個對我應該怎麼偏執是。上述只是普通的老式MD5就足夠了嗎?另一種選擇是使用openssl爲pem生成密鑰,然後可能使md5的結果保持簡潔,這聽起來是否過分偏執,甚至在現實中增加了一層安全性?

任何想法,甚至alternataaives感激地收到!

感謝

回答

3

這實際上是一個簡單的實施hash-based message authentication code的。

假設你打算在(user_id, resource_id)對的基礎上發放這些密鑰,並保留你稱爲salt的祕密的值,並且你不希望認真嘗試攻擊,這應該起作用。但是,最佳實踐表明,應該使用比單純串聯來更安全的算法來組合密鑰和數據,以及更強的摘要算法,如SHA-1;有一個標準的HMAC-SHA1組合算法,它可以很好地工作。

第三個值實際上是一個鍵,而不是鹽;擁有這個密鑰是允許生成和驗證驗證碼的。

+0

謝謝,這正是我一直在尋找的。知道必須有一個已知的技術,這只是很難表達搜索條件! – matth 2010-10-28 11:05:33

0

這取決於你想要防範什麼。在它自己的這將防止偶然濫用您的API,但它不會阻止重播攻擊。如果有人正在嗅探您的流量,那麼他們會看到密鑰,並能夠通過重新使用它來訪問資源。將SSL添加到解決方案可防止此類攻擊。

當你在它上面時,你可能會改變MD5到SHA-256。

+0

謝謝,我明白,關鍵不提供這個級別的安全性,因爲它可以被攔截和濫用。只需尋找一個安全的身份驗證機制,就會考慮使用SSL進行通信。 – matth 2010-10-28 11:07:23