2015-07-06 42 views
2

String s在Java中保持一段時間,可能a long while。這是一件好事,除非String包含用戶的實際密碼。 Character arrays are suggested,因爲它們不是不可變的,可以更快地清除。 (讓我們希望不會有像Heartbleed一樣工作的「苦咖啡」攻擊,但是對JVM(遠程堆轉儲))。如何減少在Spring中在內存中攻擊密碼的表面積?

我注意到,春季安全的PasswordEncoder需要CharSequence不是字符串,可能是這個原因。不過,我不確定我應該使用什麼對象來將密碼保留在內存預散列中。 StringBuilder會合適嗎?那將是什麼樣子?我甚至不確定是否要創建一個REST API(通過Spring Data或Spring MVC引導下的Jackson),我可以如何保持它不變爲String

我如何代碼創建/更新密碼,同時又是儘可能的安全,並避免使用String S中的各種問題一個JSON REST API?

+2

在你進入spring安全之前,你將不得不避免這樣一個事實:大多數REST框架(包括spring安全內置web安全性)都會將密碼作爲請求參數獲取......這是一個字符串。 –

回答

1

如何我可以編寫用於創建,同時 是儘可能的安全和使用字符串避免與 的各種問題/更新密碼一個JSON REST API?

良好的API密鑰是不正確的密碼。您可以控制API密鑰的創建方式,因此您可以創建一個隨機字符串,它具有非常低的碰撞(即雙UUID)和非常低的公共子字符串(在進行重複數據刪除的情況下)。在客戶端通過REST API使用密鑰登錄後,您可以使用臨時令牌,從而提高API密鑰獲取垃圾回收的可能性。

至於對付真正的密碼,這對於(可能重置API密鑰),你真的沒有太多的選擇因爲幾乎每一個servlet容器會變成請求參數轉換爲字符串人類記錄的情況。一個俗氣的選擇是讓客戶端通過Javascript(或任何客戶端)Base64編碼密碼,然後添加一個分隔符,然後將隨機生成的數字或字符串添加到密碼。這不是真正的混淆,而是再次降低保持相同字符串的可能性。當然,你必須小心解碼爲char或byte數組,然後通過操作char或byte數組來刪除隨機後綴(請參閱CharBuffer)。

另一個複雜的選擇是微服務雲方法。只需製作一個認證服務,由幾個只能進行認證的小型循環實例組成。讓這些JVM實例經常重新啓動(以刷新內存)。或者如果他們足夠小,他們會希望更頻繁地收集垃圾。

我會認爲當然是你的數據倉庫有鹽漬密碼(否則這種安全措施是非常實際意義)。

爲了雖然有,我真的不認爲它的價值對於大多數用例的HTTP服務器的環境中工作的許多其他威脅是誠實的。

爲什麼,因爲Swing是用於桌面環境的Java Swing使用char[]密碼的原因。桌面環境更容易出現惡意程序,例如病毒/間諜軟件,可能會對內存進行一些內存探測。

隨着你應該擔心,而不是服務器,在其心中真正的客戶。

+0

是啊,我正在構建的API主要是以角度或其他方式編寫的用戶前端和用戶前端,而我的實體目前正在通過BCryptPasswordEncoder進行轉換。 我有點像你的想法是什麼是有效的客戶端鹽。我們可以使用csrfToken來驗證它。 讓我們希望不會有遠程內存攻擊,但我擔心諸如「Java Debugger over HTTP」+「字符串重複數據刪除」之類的功能會使這種情況更容易發生。考慮到這一點,可能意味着我們可以構建功能,使其不太可能。 – xenoterracide

+0

還要記住,Java不是C或C++,並且沒有無效的指針算術,緩衝區溢出等等。所以雖然密碼在內存中懸掛的時候仍然不好,但與其他沒有的語言保護內存分配。 –

+0

對,「我的代碼」永遠不會造成問題。但Java有熱點,並用C編寫?這確實有......我不是說這種情況會發生,而只是在考慮最糟糕的情況。像心跳的某人elses錯誤...語言錯誤...或...(你是什麼意思你打開調試器通過http與prod密碼123)。另外我最初認爲這可能只是一個知識/文檔差距。 – xenoterracide