Maaari mong marinig ang ganoong tanong sa isang panayam para sa posisyon ng Java Junior. Ngunit tinanong ito sa aking kaibigan sa isang panayam para sa posisyon ng Technical Lead.
Parehong
String
, at isang character array ay maaaring gamitin upang mag-imbak ng data ng text. Ngunit ang sinasadyang pagpili ng isa o ang isa para sa isang partikular na gawain ay mahirap kung hindi ka pa nakakaranas ng katulad na sitwasyon. Gayunpaman, tulad ng itinuro ng aking kaibigan, ang anumang tanong na may kaugnayan sa
String
, ay karaniwang nagsasangkot ng isang espesyal na katangian ng mga string na tinatawag na immutability (
Immutable
), at sinamantala niya ito sa panayam. Kaya, tingnan natin ang ilang dahilan kung bakit dapat mong gamitin ang
char []
, at hindi , upang iimbak ang iyong password
String
.
Dahilan 1. Ang mga string ay hindi nababago
Dahil ang mga string ay hindi nababago sa Java, ang iyong plain text na password ay magiging available sa memorya hanggang sa alisin ito ng basurero. At dahil
String
ginagamit ang mga ito
String pool
para sa paulit-ulit na paggamit, mayroong isang medyo mataas na posibilidad na ang password ay mananatili sa memorya sa loob ng mahabang panahon, na hindi naman ligtas.
Ang Java String pool ay isang pool o set ng mga bagay (mga string) na matatagpuan sa isang espesyal na lugar - ang heap. Ang string sa Java ay isa sa mga pinakakaraniwang uri ng data. Ito ay hindi isang primitive na uri, ngunit isang bagay, dahil ito ay napaka resource-intensive. Kaya, upang mag-imbak ng isang string ng apat na mga character, kailangan mong maglaan ng 56 bytes ng memorya. Ito ang dahilan kung bakit ang mga string, tulad ng iba pang mga bagay, ay naka-imbak sa heap. |
Maaaring mahanap ng sinumang may access sa memory dump ang password sa plain text, na isang magandang dahilan para gumamit ng naka-encrypt na password sa halip na plain text. Dahil ang mga string ay hindi nababago, ang kanilang mga nilalaman ay hindi mababago. Ang anumang pagbabago ay lilikha ng bagong linya. Ngunit sa kaso ng
char []
, maaari mong palitan ang alinman sa mga elemento nito ng zero o isang walang laman na character. Kaya, ang pag-iimbak ng password sa isang character array ay malinaw na binabawasan ang panganib ng pagharang ng password.
Dahilan 2. Mga rekomendasyon ng mga may-akda
Ang Java mismo (mabuti, sa pamamagitan ng mga tagalikha nito, siyempre) ay nagrerekomenda ng paggamit ng isang pamamaraan
getPassword ()
mula sa klase
JPasswordField
na nagbabalik
char []
. Maaari mo ring subukan ang hindi na ginagamit na paraan
getText ()
. Bakit hindi sundin ang mga rekomendasyon ng mga may-akda ng wika?
Dahilan 3. Ilimbag
Sa isang uri,
String
palaging may panganib na ang tekstong nakaimbak sa string ay mai-print sa log file o sa console. Kasabay nito, kung gagamitin mo ang
Array
, hindi mo ipi-print ang mga nilalaman ng array, ngunit ang lokasyon lamang nito sa memorya. Siyempre, hindi ito eksaktong seryosong dahilan, ngunit may katuturan din ito.
String strPassword = "Unknown";
char [] charPassword = new char [] {'U', 'n', 'k', 'w', 'o', 'n'};
System.out.println ("String password:" + strPassword);
System.out.println ("char password:" + charPassword);
String password: Unknown
Character password: [C@110b053
Siyempre, ang paggamit
char []
ng Java upang mag-imbak ng mga password sa sarili nito ay hindi isang panlunas sa lahat. Kailangan mong gumawa ng mga pag-iingat sa seguridad, tulad ng pagtatrabaho sa mga hash at pag-encrypt ng mga password sa halip na iimbak ang mga ito sa plain text. At, siyempre, tanggalin ito mula sa memorya kaagad pagkatapos ng pamamaraan ng pagpapatunay.
Batay sa mga materyales mula sa Javarevisited
GO TO FULL VERSION