我正試圖輕松地生成一個退訂鏈接,而不需要有每個用戶的秘密。我的建議是發送sha512(email shared_secret)作為一個 "退訂令牌"。
鑒于用戶知道email以及sha512(email)的清晰文本,這是否安全,或者是否會使攻擊者更容易猜到shared_secret?
uj5u.com熱心網友回復:
想一想你要實作的目標。你生成了一個令牌,當你從一個不受信任的來源收到它時,你想確保這個令牌實際上是由你生成的,而不需要自己存盤它。
這方面的加密工具是一個訊息認證碼,如HMAC。在不涉及太多細節的情況下,HMAC 是指用包括秘密在內的散列資料,類似于你所提議的,但實際上是以一種安全的方式來抵御一系列的攻擊。因此,在一個仍然幼稚的實作中,你可以生成一個 HMAC(email, shared_secret) 并將其作為你的退訂令牌發送。
然而,如果實施不當,HMAC 的通常問題是重放。該令牌將僅取決于用戶的電子郵件地址,而不是其他。如果這個電子郵件地址曾經取消訂閱并收到一個令牌(也可能被破壞),該令牌將永遠有效,以取消該電子郵件地址的訂閱,即可以被攻擊者重放。如果是在一個不是很關鍵的應用程式中的普通退訂鏈接,這可以是一個可接受的風險,或者你可以更好地實作它。例如,你可以有一個時間戳(如unixtime)也被添加到組合中,并生成代碼為[timestamp, HMAC(email timestamp, secret)],即你將在代碼中包括時間戳,并將其添加到你的退訂鏈接明文中。當服務器收到退訂請求時,它可以重新生成HMAC,檢查它是否相同,并檢查時間戳,以確保它不會太舊。這樣做的好處是,它仍然是無狀態的,而且對于大多數應用來說是合理安全的。
或者你可以只為你的用戶存盤一個唯一的令牌,這當然是最安全的,原因有很多(主要是復雜性較低,攻擊面最小),但是有狀態。
uj5u.com熱心網友回復:
如果沒有必要,永遠不要發布甚至是加密的秘密。在不發送加密的秘密和發送秘密的比較中,不發送加密的秘密顯然更好。想象一下,如果一個用戶注冊了多個賬戶,并取消了所有賬戶的訂閱。他/她可能會猜到你輸入的公式,如果是這樣,他/她會知道結果的值只在其輸入的電子郵件中不同。通過改變電子郵件,也許是100個電子郵件,這可能會導致接近黑客攻擊你。相反,我建議生成一個令牌,以某種方式唯一地識別一個用戶,并將該令牌發送給用戶。該令牌不應該依賴于你不打算分享的資訊。它可以依靠ID、電子郵件和一個鹽。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/313432.html
標籤:
