我正在從一個應用程序到另一個應用程序進行API調用。我處理授權通過傳遞md5
版共享的祕密+時間戳...如何通過可靠的時間戳傳遞API令牌
$token = md5($secret . time());
然後在API端點,我檢查這樣的請求的真實性...
if (md5($shared_secret . time()) == $token)
...do stuff
這工作。但它不如我想要的那麼可靠。我懷疑這是由於網絡延遲(或者我的速度慢的本地主機服務器)導致時間戳一秒鐘左右不匹配。
我通過刪除時間戳的最後一位數字,以一種懶惰的方式解決了這個問題,從而爲我的緩存服務器創建了長達10秒的窗口來進行呼叫。不過,我對此並不滿意,因爲如果這次電話會在第9秒的末尾落下,我會再次遇到相同的問題(發送####### 49!=在##處收到###### 50)。
必須有更好的方法來做到這一點。它是什麼?
你是完全正確的。我忘了發送純文本的時間戳!這正是我過去做過的事情,我只是簡單地忘記了。我很想知道更多關於你對MAC和md5的看法。爲什麼MD5是一個糟糕的選擇? (順便說一下,我使用PHP) – emersonthis
[擴展長度攻擊](https://en.wikipedia.org/wiki/Length_extension_attack)是這個問題的構造問題。例如,根據時間格式和/或接收者解釋時間的靈活程度,攻擊者可能能夠使用令牌在未來創建新的令牌,並通過接收者的驗證。 PHP有一個[HMAC實現](http://php.net/manual/en/function.hash-hmac.php)。 HMAC在與md5一起使用時被認爲是安全的,但除非你有特別的理由使用md5,否則我建議sha256。 – Michael
PHP HMAC非常值得了解。但是,我不是100%確定如何將其應用於我的情況,因爲我沒有發送任何加密數據。只是共享的祕密+時間戳。那麼這個'hmac('md5','foobar',$ secret)是一個比簡單的'md5($ secret)'更好的標誌嗎?或者也許它們是等價的,'hmac'的優點是可以使用sha256嗎? – emersonthis