我在AppEngine上運行REST服務(可能不相關)。每個REST請求都伴隨着一個用戶標識和密碼,並且在每個請求開始時,我會散列密碼以查看它是否與我的記錄匹配,然後再繼續。通過多個請求進行高效密碼散列
理論上這很好,但在實踐中,我得到了來自用戶的請求--4秒或5秒。這需要BCrypt 500ms來爲每個請求散列密碼!真是太浪費了!
顯然,我不想優化BCrypt的時間。是否有緩存哈希的標準做法? memcache會是一個安全的地方,用於存儲最近散列的密碼錶及其哈希表?我想在這一點上,我可能會將用戶的純文本密碼存儲在Memcache中。我很樂意做一個3ms的memcache查找,而不是500ms的哈希,但是安全是最重要的。實施某種類型的會話抽象會更有意義嗎?
感謝您的任何建議!
編輯額外的上下文:這是一個存儲敏感的學生數據(成績)的成績簿應用程序。教師和學生從任何地方登錄,包括通過wifi等。每個成功的請求都通過https發送。
哇,不會期望谷歌應用程序引擎操作的基礎,因爲這需要這麼長的時間......發佈會話cookie是相當標準的,但如果不在安全的連接上,則會遭到盜竊/劫持......關於您的應用程序的更多上下文可能會幫助ppl提供更有用的答案 - 您可接受的容差是什麼......這是一個銀行應用程序嗎? (懷疑它,如果託管在谷歌應用程序,但只是一個理論問題......) – Nathan
@Nathan:這裏的問題的一部分是,bcrypt是*假設*慢(http://en.wikipedia.org/維基/ Key_stretching)。但是正如Rhuidean所說,你可以使用密碼來建立一個會話密鑰,它可以是(a)大的,(b)隨機的,(c)短暫的,因此更難以暴力破解,無論是在線如果攻擊者以某種方式獲取了存儲的會話密鑰的散列值,那麼請求或服務器淹沒服務器。因此,對於會話密鑰,您可以使用較少的哈希輪次數 - 對於大多數情況下,我認爲您可以使用零輪次並存儲普通會話密鑰。 –
@Nathan:我在OP中添加了你正在尋找的上下文。感謝關於會話密鑰更快散列的想法,@SteveJessop;我想如果我走這條路,我可能會用零,但我沒有想過調整難度。 –