为什么 char 数组比 String 更适合存储密码?
另一個基于?String?的棘手 Java 問題,相信我只有很少的 Java 程序員可以正確回答這個問題。
這是一個真正艱難的核心 Java 面試問題,并且需要對?String?的扎實知識才能回答這個問題。
這是最近在?Java 面試中向我的一位朋友詢問的問題。
他正在接受技術(shù)主管職位的面試,并且有超過6年的經(jīng)驗。如果你還沒有遇到過這種情況,那么字符數(shù)組和字符串可以用來存儲文本數(shù)據(jù),但是選擇一個而不是另一個很難。
但正如我的朋友所說,任何與?String?相關(guān)的問題都必須對字符串的特殊屬性有一些線索,比如不變性,他用它來說服訪提問的人。在這里,我們將探討為什么你應(yīng)該使用char[]存儲密碼而不是String的一些原因。
字符串:
1)由于字符串在 Java 中是不可變的,如果你將密碼存儲為純文本,它將在內(nèi)存中可用,直到垃圾收集器清除它,并且為了可重用性,會存在?String?在字符串池中, 它很可能會保留在內(nèi)存中持續(xù)很長時間,從而構(gòu)成安全威脅。
由于任何有權(quán)訪問內(nèi)存轉(zhuǎn)儲的人都可以以明文形式找到密碼,這是另一個原因,你應(yīng)該始終使用加密密碼而不是純文本。
由于字符串是不可變的,所以不能更改字符串的內(nèi)容,因為任何更改都會產(chǎn)生新的字符串,而如果你使用char[],你就可以將所有元素設(shè)置為空白或零。
因此,在字符數(shù)組中存儲密碼可以明顯降低竊取密碼的安全風(fēng)險。
2)Java 本身建議使用?JPasswordField?的?getPassword()?方法,該方法返回一個?char[]?和不推薦使用的getTex()?方法,該方法以明文形式返回密碼,由于安全原因。應(yīng)遵循 Java 團(tuán)隊的建議, 堅持標(biāo)準(zhǔn)而不是反對它。
3)使用?String?時,總是存在在日志文件或控制臺中打印純文本的風(fēng)險,但如果使用 Array,則不會打印數(shù)組的內(nèi)容而是打印其內(nèi)存位置。雖然不是一個真正的原因,但仍然有道理。
String?strPassword?=“Unknown”;?? char?[]?charPassword?=?new?char?[]?{'U','n','k','w','o','n'};?? System.out.println(“字符密碼:”+ strPassword);?? System.out.println(“字符密碼:”+ charPassword);輸出
字符串密碼:Unknown ?
字符密碼:[C @110b053
我還建議使用散列或加密的密碼而不是純文本,并在驗證完成后立即從內(nèi)存中清除它。
因此,在Java中,用字符數(shù)組用存儲密碼比字符串是更好的選擇。
雖然僅使用char[]還不夠,還你需要擦除內(nèi)容才能更安全。
版本申明:本作品系作者 Yujiaao?原創(chuàng),采用《署名-非商業(yè)性使用-禁止演繹 4.0 國際》許可協(xié)議,來源:segmentfault.com/a/1190000019962661
總結(jié)
以上是生活随笔為你收集整理的为什么 char 数组比 String 更适合存储密码?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 因 Redis 分布式锁造成的 P0 级
- 下一篇: 面试官:你能告诉我一个请求过来,Spri