JavaRush /Java Blog /Random-TL /Q&A: Bakit mas mainam na mag-imbak ng password sa Java sa...

Q&A: Bakit mas mainam na mag-imbak ng password sa Java sa isang character array kaysa sa isang String?

Nai-publish sa grupo
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.
Q&A: Bakit mas mainam na mag-imbak ng password sa Java sa isang character array kaysa sa isang String?  - 1
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 Stringginagamit ang mga ito String poolpara 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 JPasswordFieldna 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, Stringpalaging 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
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION