මුරපද සඳහා සංගීතයට වඩා වර්‍ගය [] වඩා කැමති ඇයි?


3425

Swing දී, මුරපදය ක්ෂේත්රය ඇත getPassword()(ප්රතිලාභ char[]වෙනුවට සුපුරුදු ක) ක්රමය getText()(ප්රතිලාභ String) ක්රමය. ඒ හා සමානව, Stringමුරපද හැසිරවීමට භාවිතා නොකරන ලෙස මට යෝජනාවක් හමු වී තිබේ.

Stringමුරපද සම්බන්ධයෙන් ආරක්ෂාවට තර්ජනයක් වන්නේ ඇයි ? එය භාවිතා කිරීමට අපහසු බවක් දැනේ char[].

Answers:


4292

නූල් වෙනස් නොවේ . එයින් අදහස් වන්නේ ඔබ නිර්මාණය කළ පසු String, වෙනත් ක්‍රියාවලියකට මතකය ඉවත දැමිය හැකි නම්, කසළ එකතු කිරීමට පෙර දත්ත ඉවත් කිරීමට ඔබට හැකියාවක් නැත ( පරාවර්තනය හැර ) .

අරාව සමඟ, ඔබ එය අවසන් කළ පසු දත්ත පැහැදිලිවම පිස දැමිය හැකිය. ඔබ කැමති ඕනෑම දෙයක් සමඟ අරාව නැවත ලිවිය හැකි අතර, කසළ එකතු කිරීමට පෙර පවා මුරපදය පද්ධතියේ කොතැනකවත් නොපවතී.

ඉතින් ඔව්, මේ වන ආරක්ෂක කනස්සල්ල - නමුත් පවා භාවිතා char[]පමණක් පහර කිරීම සඳහා අවස්ථාව කවුළුව අඩු, සහ එය ප්රහාරය මෙම සුවිශේෂ වර්ගය සඳහා විතරයි.

අදහස් දැක්වීමේදී සඳහන් කර ඇති පරිදි, කසළ එකතු කරන්නා විසින් ගෙන යන අරා දත්තවල අයාලේ පිටපත් මතකයේ රැඳෙනු ඇත. මම මේ ක්රියාත්මක විශේෂිත වේ විශ්වාස - කුණු එකතු විය හැක දෙයක් මෙම වර්ග කිරීම වළක්වා ගැනීමට, එය යනවා ලෙස මතකය පැහැදිලි. එය එසේ වුවද, char[]ප්‍රහාරක කවුළුවක් ලෙස සත්‍ය අක්‍ෂර අඩංගු කාලය තවමත් පවතී .


3
ක්‍රියාවලියකට ඔබගේ යෙදුමේ මතකයට ප්‍රවේශය තිබේ නම්, එය දැනටමත් ආරක්ෂක උල්ලං is නය කිරීමකි, නේද?
යේටි

6
Et යෙටි: ඔව්, නමුත් එය කළු හා සුදු මෙන් නොවේ. ඔවුන්ට ලබා ගත හැක්කේ මතකයේ සැණින් ඡායාරූපයක් පමණක් නම්, එම ස්නැප්ෂොට් වලට කළ හැකි හානිය අවම කිරීමට හෝ සැබවින්ම බැරෑරුම් සැණින් ඡායාරූපයක් ගත හැකි කවුළුව අඩු කිරීමට ඔබට අවශ්‍යය.
ජෝන් ස්කීට්

12
පොදු ප්‍රහාරක ක්‍රමයක් නම්, මතකය විශාල ප්‍රමාණයක් වෙන් කරන ක්‍රියාවලියක් ක්‍රියාත්මක කර මුරපද වැනි ඉතිරිව ඇති ප්‍රයෝජනවත් දත්ත සඳහා එය පරිලෝකනය කිරීමයි. ක්‍රියාවලියට වෙනත් ක්‍රියාවලියක මතක අවකාශයට කිසිදු ඉන්ද්‍රජාලික ප්‍රවේශයක් අවශ්‍ය නොවේ; එය රඳා පවතින්නේ පළමුවෙන්ම සංවේදී දත්ත ඉවත් නොකර මිය යන වෙනත් ක්‍රියාවලීන් මත වන අතර මෙහෙයුම් පද්ධතිය නව ක්‍රියාවලියකට ලබා දීමට පෙර මතකය (හෝ පිටු බෆර) ඉවත් නොකරයි. char[]ස්ථානවල ගබඩා කර ඇති මුරපද ඉවත් කිරීමෙන් එම ප්‍රහාර රේඛාව කපා හැරේ, එය භාවිතා කිරීමේදී කළ නොහැකි දෙයක් String.
ටෙඩ් හොප්

වෙනත් ක්‍රියාවලියකට ලබා දීමට පෙර මෙහෙයුම් පද්ධතිය මතකය ඉවත් නොකරන්නේ නම්, මෙහෙයුම් පද්ධතියට ප්‍රධාන ආරක්ෂක ගැටළු තිබේ! කෙසේ වෙතත්, තාක්ෂණික වශයෙන් නිශ්කාෂණය බොහෝ විට ආරක්ෂිත මාදිලියේ උපක්‍රම මගින් සිදු කෙරෙන අතර CPU කැඩී ඇත්නම් (උදා: ඉන්ටෙල් මෙල්ඩවුන්) තවමත් පැරණි මතක අන්තර්ගතයන් කියවිය හැකිය.
මිකෝ රන්ටලයිනන්

1223

මෙහි වෙනත් යෝජනා වලංගු යැයි පෙනුනද, තවත් හොඳ හේතුවක් තිබේ. සරල ලෙස Stringඔබට ලොග් , මොනිටර හෝ වෙනත් අනාරක්ෂිත ස්ථානයකට මුරපදය අහම්බෙන් මුද්‍රණය කිරීමට වැඩි ඉඩක් ඇත. char[]අඩු අවදානමක් ඇත.

මෙය සලකා බලන්න:

public static void main(String[] args) {
    Object pw = "Password";
    System.out.println("String: " + pw);

    pw = "Password".toCharArray();
    System.out.println("Array: " + pw);
}

මුද්‍රණ:

String: Password
Array: [C@5829428e

41
oooo, නමුත් ඔබ සෘජු ලිවීම හරහා ප්‍රවාහයට සහ සංක්ෂිප්තයට පිවිසෙනු ඇතැයි මට සැකයි.
ල ging ු

42
R Thr4wn පෙරනිමි ක්‍රියාත්මක කිරීම toStringවේ classname@hashcode. [Cනිරූපණය කරන්නේ char[], ඉතිරිය ෂඩාස්රාකාර හැෂ් කේතයයි.
කොන්රාඩ් ගරස්

16
සිත්ගන්නා අදහස. අරා සඳහා අර්ථවත් ටෝස්ට්‍රිං ඇති ස්කලා වෙත මෙය මාරු නොවන බව පෙන්වා දීමට කැමැත්තෙමි.
mauhiz

38
මම මේ සඳහා Passwordපන්ති වර්ගයක් ලියමි . එය අඩු අපැහැදිලි වන අතර අහම්බෙන් කොහේ හෝ ගමන් කිරීම දුෂ්කර ය.
දකුණට

8
වර්‍ග අරාව වස්තුවක් ලෙස දමනු ඇතැයි යමෙකු සිතන්නේ ඇයි? සෑම කෙනෙකුම මෙම පිළිතුරට කැමති ඇයිදැයි මට විශ්වාස නැත. ඔබ මෙය කළා යැයි සිතමු: System.out.println ("මුරපදය" .toCharArray ());
GC_

681

නිල ලේඛනයක් උපුටා දැක්වීම සඳහා, ජාවා ගුප්ත ලේඛන ගෘහ නිර්මාණ මාර්ගෝපදේශය මෙය char[]එදිරිව Stringමුරපද ගැන (මුරපදය මත පදනම් වූ සංකේතනය ගැන, නමුත් මෙය සාමාන්‍යයෙන් මුරපද ගැන වේ):

මුරපදය එක්තරා ආකාරයක වස්තුවක එකතු කර ගබඩා කිරීම තර්කානුකූල යැයි පෙනේ java.lang.String. කෙසේ වෙතත්, මෙන්න අවවාදයයි: Objectවර්ගයේ Stringවෙනස් කළ නොහැකි ය, එනම්, String භාවිතයෙන් පසු අන්තර්ගතය වෙනස් කිරීමට (නැවත ලිවීමට) හෝ ශුන්‍ය කිරීමට ඔබට ඉඩ සලසන ක්‍රම නිර්වචනය කර නොමැත . Stringපරිශීලක මුරපද වැනි ආරක්ෂක සංවේදී තොරතුරු ගබඩා කිරීම සඳහා මෙම අංගය වස්තු නුසුදුසු කරයි . ඔබ සැමවිටම charඒ වෙනුවට ආරක්‍ෂිත සංවේදී තොරතුරු අරාව තුළ රැස් කර ගබඩා කළ යුතුය .

ජාවා ක්‍රමලේඛන භාෂාව සඳහා වන ආරක්ෂිත කේතීකරණ මාර්ගෝපදේශයේ 2-2 මාර්ගෝපදේශය, 4.0 අනුවාදය ද ඒ හා සමාන දෙයක් පවසයි (එය මුලින් ලොග් වීමේ සන්දර්භය තුළ වුවද):

මාර්ගෝපදේශ 2-2: ඉහළ සංවේදී තොරතුරු ලොග් නොකරන්න

සමාජ ආරක්ෂණ අංක (එස්එස්එන්) සහ මුරපද වැනි සමහර තොරතුරු ඉතා සංවේදී ය. මෙම තොරතුරු අවශ්‍ය ප්‍රමාණයට වඩා වැඩි කාලයක් තබා නොගත යුතුය. උදාහරණයක් ලෙස, එය ලොග් ලිපිගොනු වෙත යැවිය යුතු අතර සෙවුම් හරහා එහි පැවැත්ම හඳුනාගත නොහැක. සමහර අස්ථිර දත්ත වර්‍ග අරා වැනි විකෘති දත්ත ව්‍යුහයන් තුළ තබා ගත හැකි අතර ඒවා භාවිතයෙන් පසු නිෂ්කාශනය වේ. දත්ත ව්‍යුහයන් ඉවත් කිරීමෙන් සාමාන්‍ය ජාවා ධාවන කාල පද්ධතිවල effectiveness ලදායීතාවය අඩු වී ඇති අතර වස්තු මතකයේ විනිවිද පෙනෙන ලෙස ක්‍රමලේඛකයා වෙත ගෙන යනු ලැබේ.

මෙම මාර්ගෝපදේශයට ඔවුන් ගනුදෙනු කරන දත්ත පිළිබඳ අර්ථකථන දැනුමක් නොමැති පහළ මට්ටමේ පුස්තකාල ක්‍රියාත්මක කිරීම සහ භාවිතා කිරීම සඳහා ඇඟවුම් ද ඇත. නිදසුනක් ලෙස, පහත් මට්ටමේ නූල් විග්‍රහ කිරීමේ පුස්තකාලයක් මඟින් එය ක්‍රියාත්මක වන පෙළ ලොග් කළ හැකිය. යෙදුමක් පුස්තකාලය සමඟ SSN විග්‍රහ කළ හැකිය. ලොග් ලිපිගොනු වෙත ප්‍රවේශය ඇති පරිපාලකයින්ට SSN ලබා ගත හැකි තත්වයක් මෙය නිර්මාණය කරයි.


4
මෙය හරියටම ජෝන් ගේ පිළිතුරට පහළින් මා කතා කරන දෝෂ සහිත / ව්‍යාජ සඳහනකි, එය ප්‍රසිද්ධ මූලාශ්‍රයක් / බොහෝ විවේචන.
bestsss

38
est බෙස්ටාස් කරුණාකර ඔබට යොමු කිරීමක් ද සඳහන් කළ හැකිද?
user961954

10
@bestass සමාවෙන්න, නමුත් Stringඉතා හොදින් අවබෝධ කර ගත හැකි ය හා එය JVM දී හැසිරෙන ආකාරය ... භාවිතා කිරීමට හොඳ හේතු තිබේ char[]වෙනුවට Stringආරක්ෂිත ආකාරයෙන් මුරපද සමඟ කටයුතු කරන විට.
SnakeDoc

3
මුරපදය යළිත් වරක් බ්‍රවුසරයේ සිට ඉල්ලීමක් ලෙස 'string' char ලෙස නොපවතින නමුත්? ඉතින් ඔබ කුමක් කළත් එය නූලක් වන අතර, එය ක්‍රියාත්මක කර ඉවත දැමිය යුත්තේ කුමන අවස්ථාවේදීද?
ඩවේසි

3
Aw ඩාවේසි - At which point- එය යෙදුම විශේෂිත ය, නමුත් සාමාන්‍ය රීතිය වන්නේ මුරපදයක් යැයි සිතිය හැකි යමක් ඔබ අල්ලා ගත් වහාම එය සිදු කිරීමයි (සරල පෙළ හෝ වෙනත් ආකාරයකින්). උදාහරණයක් ලෙස, ඔබ එය බ්‍රව්සරයෙන් ලබා ගන්නේ HTTP ඉල්ලීමක කොටසක් ලෙස ය. ඔබට භාරදීම පාලනය කළ නොහැක, නමුත් ඔබට ඔබේම ගබඩාව පාලනය කළ හැකිය, එබැවින් ඔබට එය ලැබුණු විගසම එය වර්‍ගයකට දමන්න, ඔබට එය කළ යුතු දේ කරන්න, ඉන්පසු සියල්ල '0' ලෙස සකසා gc ට ඉඩ දෙන්න එය නැවත ලබා ගන්න.
luis.espinal

354

අක්ෂර අරා ( char[]) භාවිතයෙන් පසු සෑම අක්‍ෂරයක්ම බිංදුවට සැකසීමෙන් ඉවත් කළ හැකිය. යමෙකුට මතක රූපය කෙසේ හෝ දැකිය හැකි නම්, නූල් භාවිතා කරන්නේ නම් ඔවුන්ට සරල පා text යකින් මුරපදයක් දැකිය හැකිය, නමුත් char[]එය භාවිතා කරන්නේ නම්, 0 සමඟ දත්ත පිරිසිදු කිරීමෙන් පසු මුරපදය ආරක්ෂිත වේ.


13
පෙරනිමියෙන් ආරක්ෂිත නොවේ. අපි වෙබ් යෙදුමක් ගැන කතා කරන්නේ නම්, බොහෝ වෙබ් බහාලුම් මුරපදය HttpServletRequestවස්තුවට සරල පෙළෙහි යවනු ඇත . JVM අනුවාදය 1.6 හෝ ඊට අඩු නම්, එය permgen අවකාශයේ පවතිනු ඇත. එය 1.7 හි තිබේ නම්, එය එකතු වන තුරු එය තවමත් කියවිය හැකිය. (එසේ වූ විට.)
avgvstvs

4
gavgvstvs: නූල් ස්වයංක්‍රීයව පර්ම්ජන් අවකාශයට ගෙන නොයනු ඇත, එය අදාළ වන්නේ අභ්‍යන්තර නූල් වලට පමණි. ඊට අමතරව, පර්ම්ජන් අවකාශය ද අඩු අනුපාතයකින් කුණු එකතු කිරීමට යටත් වේ. පර්ම්ජන් අවකාශයේ ඇති සැබෑ ගැටළුව නම් එය ස්ථාවර ප්‍රමාණයයි, කිසිවෙකු intern()අත්තනෝමතික ලෙස අත්තනෝමතික නූල් ඉල්ලා නොසිටීමට හේතුව එයයි . නමුත් ඔබ නිවැරදියි, එම Stringසිද්ධීන් පළමු ස්ථානයේ (එකතු වන තුරු) පවතින අතර char[]පසුව ඒවා අරා බවට පත් කිරීමෙන් එය වෙනස් නොවේ.
හොල්ගර්

3
බලන්න @Holger docs.oracle.com/javase/specs/jvms/se6/html/... "එසේ නැත්නම්, පන්ති, සංගීත නව උදාහරණයක් වශයෙන් CONSTANT_String_info ව්යුහය විසින් ලබා දී යුනිකෝඩ් අක්ෂර අනුක්රමය අඩංගු නිර්මාණය ඇත; පන්ති උදාහරණයක් ප්රතිඵලයකි අවසාන වශයෙන්, නව සංගීත සිද්ධියේ අභ්‍යන්තර ක්‍රමය ක්‍රියාත්මක වේ. 1.6 දී, ජේවීඑම් සමාන අනුක්‍රමයන් අනාවරණය කරගත් විට ඔබ වෙනුවෙන් සීමාවාසිකයා අමතනු ඇත.
avgvstvs

3
Ol හොල්ගර්, ඔබ නිවැරදියි මම නියත තටාකය සහ නූල් තටාකය සම්බන්ධ කර ගත්තෙමි, නමුත් පර්ම්ජන් අවකාශය යෙදෙන්නේ අභ්‍යන්තර නූල් වලට පමණක් බව අසත්‍යයකි . 1.7 ට පෙර, නියත_පූල් සහ ස්ට්‍රිං_පූල් යන දෙකම පර්ම්ජන් අවකාශයේ වාසය කළේය. ඒ කියන්නේ ගොඩට වෙන් කර ඇති එකම නූල් පන්තිය ඔබ කී පරිදි විය, new String()නැතහොත් StringBuilder.toString()මම බොහෝ නියත නියතයන් සමඟ යෙදුම් කළමනාකරණය කළෙමි, එහි ප්‍රති per ලයක් ලෙස අපට පර්මජන් ක්‍රිප් ගොඩක් තිබුණි. 1.7 දක්වා.
avgvstvs

5
@avgvstvs: හොඳින්, නූල් නියත වන JLS බලතල, හැම විටම සිර, සිර නූල් ද permgen අවකාශය තුල අවසන් ඒ නිසා ප්රකාශයක් ලෙස, නූල් නියතයන් නිසැකයෙන්ම යොදා ගැනේ. එකම වෙනස වන්නේ මුලින්ම පර්ම්ජන් අවකාශයේ නූල් නියතයන් නිර්මාණය කර ඇති intern()අතර අත්තනෝමතික නූලක් ඇමතීමෙන් පර්ම්ජන් අවකාශයේ සමාන නූලක් වෙන් කිරීමට හේතු විය හැක. එම වස්තුව බෙදාහදා ගන්නා එකම අන්තර්ගතයේ වචන මාලාවක් නොමැති නම්, දෙවැන්නාට GC'ed ලබා ගත හැකිය…
හොල්ගර්

220

සමහර අය විශ්වාස කරන්නේ ඔබට මුරපදය අවශ්‍ය නොවන විට එය ගබඩා කිරීමට භාවිතා කරන මතකය නැවත ලිවිය යුතු බවයි. මෙය ඔබේ පද්ධතියෙන් මුරපදය කියවීමට ප්‍රහාරකයාට ඇති කාල කවුළුව අඩු කරන අතර මෙය සිදු කිරීම සඳහා ප්‍රහාරකයාට දැනටමත් ජේවීඑම් මතකය පැහැර ගැනීමට ප්‍රමාණවත් ප්‍රවේශයක් අවශ්‍ය බව නොසලකා හරියි. එතරම් ප්‍රවේශයක් ඇති ප්‍රහාරකයෙකුට මෙය සම්පූර්ණයෙන්ම නිෂ් less ල වන ඔබගේ ප්‍රධාන සිදුවීම් අල්ලා ගත හැකිය (AFAIK, එබැවින් කරුණාකර මා වැරදියි නම් මාව නිවැරදි කරන්න).

යාවත්කාලීන කරන්න

මගේ පිළිතුර යාවත්කාලීන කළ යුතු අදහස් වලට ස්තූතියි. මුරපදයක් දෘ hard තැටියට ගොඩවිය හැකි කාලය අඩු කරන බැවින් (ඉතා) සුළු ආරක්ෂක වැඩිදියුණු කිරීමක් එකතු කළ හැකි අවස්ථා දෙකක් ඇති බව පෙනේ. තවමත් මම සිතන්නේ එය බොහෝ භාවිත අවස්ථාවන් සඳහා අධික ලෙස මරා දැමීමයි.

  • ඔබේ ඉලක්ක පද්ධතිය නරක ලෙස වින්‍යාස කර ඇති අතර ඔබ එය උපකල්පනය කළ යුතු අතර ඔබ මූලික ඩම්ප් ගැන ව්‍යාකූල විය යුතුය (පද්ධති පරිපාලකයෙකු විසින් කළමනාකරණය නොකරන්නේ නම් වලංගු විය හැකිය).
  • ප්‍රහාරකයා දෘඩාංග වෙත ප්‍රවේශය ලබා ගැනීමත් සමඟ දත්ත කාන්දු වීම වැළැක්වීම සඳහා ඔබේ මෘදුකාංගය ඕනෑවට වඩා ව්‍යාකූල විය යුතුය - TrueCrypt (අත්හිටුවා ඇත), VeraCrypt හෝ CipherShed වැනි දෑ භාවිතා කිරීම .

හැකි නම්, මූලික ඩම්ප් සහ ස්වප් ගොනුව අක්‍රීය කිරීමෙන් ගැටළු දෙකම ගැන සැලකිලිමත් වේ. කෙසේ වෙතත්, ඔවුන්ට පරිපාලක අයිතිවාසිකම් අවශ්‍ය වන අතර ක්‍රියාකාරීත්වය අඩු කිරීමට (භාවිතා කිරීමට අඩු මතකයක්) සහ ධාවන පද්ධතියකින් RAM අදින්න තවමත් වලංගු කාරණයක් වනු ඇත.


33
මම "සම්පූර්ණයෙන්ම නිෂ් less ල" වෙනුවට "සුළු ආරක්ෂක වැඩිදියුණු කිරීමක්" වෙනුවට ආදේශ කරමි. නිදසුනක් ලෙස, ඔබට tmp නාමාවලියකට කියවීමේ ප්‍රවේශය, නරක ලෙස වින්‍යාසගත කර ඇති යන්ත්‍රයක් සහ ඔබේ යෙදුමේ බිඳවැටීමක් සිදුවුවහොත් ඔබට මතක ඩම්ප් එකකට ප්‍රවේශය ලබා ගත හැකිය. එවැනි අවස්ථාවක ඔබට යතුරු පුවරුවක් ස්ථාපනය කිරීමට නොහැකි වනු ඇත, නමුත් ඔබට මූලික ඩම්ප් විශ්ලේෂණය කළ හැකිය .
ජෝකිම් සෝවර්

44
ඔබ එය අවසන් කළ විගසම මතකයෙන් සංකේතාංකනය නොකළ දත්ත පිස දැමීම හොඳම පුරුද්දක් ලෙස සලකන්නේ එය මෝඩකමක් නිසා නොවේ (එය එසේ නොවේ); නමුත් එය ඔබගේ තර්ජන නිරාවරණ මට්ටම අඩු කරන නිසා. මෙය කිරීමෙන් තත්‍ය කාලීන ප්‍රහාර වලක්වනු නොලැබේ; නමුත් එය aa හානිය අවම කිරීමේ මෙවලමකට සේවය කරන නිසා මතක ස්නැප්ෂොට් එකකට ප්‍රතික්‍රියාකාරී ප්‍රහාරයකදී නිරාවරණය වන දත්ත ප්‍රමාණය සැලකිය යුතු ලෙස අඩු කරයි (උදා: ඔබේ යෙදුම් මතකයේ පිටපතක් swap ගොනුවකට ලියා ඇති, හෝ මතකයෙන් කියවා ඇති) ධාවනය වන සේවාදායකයකින් සහ එහි තත්වය අසමත් වීමට පෙර වෙනත් එකකට මාරු විය).
ඩෑන් ඊස් ෆයිඩ්ලිං ෆයර්ලයිට්

9
මෙම ප්‍රතිචාරයේ ආකල්පය සමඟ මම එකඟ වෙමි. බොහෝ ආරක්ෂක උල්ලං aches නයන් මතකයේ ඇති බිටු වලට වඩා වියුක්ත කිරීමේ ඉහළ මට්ටමක සිදුවන බව යෝජනා කිරීමට මම උත්සාහ කරමි. නිසැකවම, අධි ආරක්ෂිත ආරක්ෂක පද්ධතිවල මෙය සැලකිය යුතු සැලකිල්ලක් දැක්විය හැකි නමුත් මෙම මට්ටමේ බැරෑරුම් ලෙස සිතීම .නෙට් හෝ ජාවා උත්තේජනය කරන යෙදුම් වලින් 99% ක් සඳහා අධික ලෙස මරණයට පත්වේ. (එය කසළ එකතු කිරීම හා සම්බන්ධයි).
කිංඩැන්ගෝ

10
මුරපද හෙළි කරමින්, සේවාදායක මතකය හෘදයාංගමව විනිවිද යාමෙන් පසුව, “සුළු ආරක්ෂණ වැඩිදියුණු කිරීමක්” යන නූල වෙනුවට “මුරපද සඳහා නූල් භාවිතා නොකිරීමට අත්‍යවශ්‍යය, නමුත් ඒ වෙනුවට වර්‍ගයක් භාවිතා කරන්න.”
පීටර් vdL

9
EtPetervdL හෘදයාංගමව අවසර දී ඇත්තේ නිශ්චිත නැවත භාවිතා කරන ලද බෆර එකතුවක් කියවීමට පමණි (ආරක්ෂක විවේචනාත්මක දත්ත සහ ජාල I / O යන දෙවර්ගය සඳහාම ඉවත් නොවී - කාර්ය සාධන හේතූන් මත), ඔබට මෙය ජාවා නූලක් සමඟ ඒකාබද්ධ කළ නොහැක. . නූලක අන්තර්ගතය ලබා ගැනීම සඳහා ඔබට ජාවා භාවිතා කර අහඹු මතකයට කියවිය නොහැක. හෘදයාබාධ ඇතිවීමට හේතු වන භාෂාව සහ සැලසුම් ගැටළු ජාවා ස්ට්‍රිං සමඟ කළ නොහැකිය.
josefx

86

මෙය වලංගු යෝජනාවක් යැයි මම නොසිතමි, නමුත්, මට අවම වශයෙන් හේතුව අනුමාන කළ හැකිය.

මුරපදය මතකයේ ඇති සියලුම හෝඩුවාවන් ක්ෂණිකව හා නිසැකවම මකා දැමිය හැකි බවට වග බලා ගැනීමට පෙළඹවීම අවශ්‍ය යැයි මම සිතමි. සමඟ char[]ඔබට අරාවේ සෑම අංගයක්ම හිස් හෝ වෙනත් දෙයක් සමඟ නැවත ලිවිය හැකිය. ඔබට Stringඒ ආකාරයෙන් අභ්‍යන්තර වටිනාකම සංස්කරණය කළ නොහැක .

නමුත් එය පමණක් හොඳ පිළිතුරක් නොවේ; ඇයි පමණක් කිරීමට වග බලා ගන්න සැඳහුම නො char[]හෝ Stringගැලවී ගත කරන්නේ කෙසේද? එවිට ආරක්ෂක ගැටළුවක් නොමැත. නමුත් කාරණය වන්නේ Stringවස්තූන් intern()න්‍යායිකව සංස්කරණය කර නියත තටාකය තුළ ජීවත්ව තබා ගැනීමයි. මම හිතන්නේ char[]මෙම හැකියාව තහනම් කිරීම.


4
ගැටලුව වන්නේ ඔබේ යොමු කිරීම් "පැන නොයනු ඇත" යන්නයි. යම්කිසි අමතර කාලයක් සඳහා නූල් මතකයේ නවීකරණය නොවී පවතින අතර char[]එය වෙනස් කළ හැකි අතර පසුව එය එකතු කර තිබේද නැද්ද යන්න අදාළ නොවේ. වචනාර්ථයෙන් තොර අය සඳහා නූල් පුහුණුව පැහැදිලිවම char[]කළ යුතු බැවින්, එය ස්ථිතික ක්ෂේත්‍රයකින් යොමු කළ හැකි යැයි පැවසීම හා සමාන වේ.
Groo

1
මුරපදය මතකයේ ඇති පෝරමයේ පෝස්ට් එකක් නොවේද?
ඩවේසි

66

පිළිතුර දැනටමත් ලබා දී ඇත, නමුත් මම මෑතකදී සොයාගත් ගැටලුවක් ජාවා සම්මත පුස්තකාල සමඟ බෙදා ගැනීමට කැමැත්තෙමි. මුරපද නූල් char[]සෑම තැනකම ප්‍රතිස්ථාපනය කිරීම ගැන ඔවුන් දැන් විශාල සැලකිල්ලක් දක්වන අතර (ඇත්තෙන්ම එය හොඳ දෙයකි), මතකයෙන් ඉවත් කිරීමේදී වෙනත් ආරක්ෂක-විවේචනාත්මක දත්ත නොසලකා හරින බවක් පෙනේ.

මම හිතන්නේ උදා: PrivateKey පන්තිය. PKCS # 12 ගොනුවකින් ඔබ පුද්ගලික RSA යතුරක් පටවන යම් අවස්ථාවක් සලකා බලන්න. දැන් මේ අවස්ථාවේ දී, යතුරු ගොනුවට භෞතික ප්‍රවේශය නිසියාකාරව සීමා කර ඇති තාක් කල් මුරපදය මිරිකීමෙන් ඔබට උදව් නොවනු ඇත. මුරපදය වෙනුවට ඔබ කෙලින්ම යතුර ලබා ගත්තේ නම් ප්‍රහාරකයෙකු ලෙස ඔබට වඩා හොඳ වනු ඇත. අපේක්ෂිත තොරතුරු විවිධාකාරයෙන් කාන්දු විය හැකිය, මූලික ඩම්ප්, නිදොස් කිරීමේ සැසියක් හෝ හුවමාරු ලිපිගොනු උදාහරණ කිහිපයක් පමණි.

පෙනෙන ආකාරයට, PrivateKeyමතකයෙන් පුද්ගලික තොරතුරු ඉවත් කිරීමට ඔබට ඉඩ සලසන කිසිවක් නැත , මන්ද අනුරූප තොරතුරු සාදන බයිට් අතුගා දැමීමට ඔබට ඉඩ දෙන API කිසිවක් නොමැති බැවිනි.

මෙය, මෙම ලෙස නරක තත්වයක් කඩදාසි උද්ගත විය හැකි සූරා කෑ හැකි ආකාරය විස්තර කරයි.

පුද්ගලික යතුරු නිදහස් කිරීමට පෙර OpenSSL පුස්තකාලය විවේචනාත්මක මතක කොටස් නැවත ලියයි. ජාවා කසළ එකතු කරන බැවින්, ජාවා යතුරු සඳහා පුද්ගලික තොරතුරු අතුගා දැමීමට සහ අවලංගු කිරීමට අපට පැහැදිලි ක්‍රම අවශ්‍ය වනු ඇත, ඒවා යතුර භාවිතා කළ විගසම යෙදිය යුතුය.


මේ සඳහා එක් ක්‍රමයක් නම්, එය ක්‍රියාත්මක කිරීම භාවිතා කිරීම PrivateKeyඇත්ත වශයෙන්ම එහි පුද්ගලික අන්තර්ගතය මතකයේ පටවන්නේ නැත: උදාහරණයක් ලෙස PKCS # 11 දෘඩාංග ටෝකනයක් හරහා. සමහර විට PKCS # 11 මෘදුකාංගය ක්‍රියාත්මක කිරීමෙන් මතකය අතින් පිරිසිදු කිරීම ගැන සැලකිලිමත් විය හැකිය. සමහර විට එන්එස්එස් ගබඩාව වැනි දෙයක් භාවිතා කිරීම (එය ක්‍රියාත්මක කිරීමේදී වැඩි ප්‍රමාණයක් PKCS11ජාවාහි ගබඩා වර්ගය සමඟ බෙදා ගනී) වඩා හොඳය. මෙම KeychainStore(OSX එකක් keystore) එහි බවට පෞද්ගලික යතුර පූර්ණ අන්තර්ගතය පටවන PrivateKeyඅවස්ථා, නමුත් එය කිරීමට අවශ්ය නොවේ. (විශ්වාස නැත මොකක්ද WINDOWS-MYKeyStore Windows මත නොවේ.)
බෲනෝ

R බ un නෝ ෂුවර්, දෘඩාංග මත පදනම් වූ ටෝකන මෙයින් පීඩා විඳින්නේ නැත, නමුත් ඔබට මෘදුකාංග යතුරක් භාවිතා කිරීමට බල කෙරෙන අවස්ථා ගැන කුමක් කිව හැකිද? සෑම යෙදවීමකටම HSM ලබා ගැනීමේ අයවැය නොමැත. මෘදුකාංග යතුරු ගබඩාවලට යම් අවස්ථාවක දී යතුර මතකයට පැටවීමට සිදුවනු ඇත, එබැවින් IMO අපට අවම වශයෙන් මතකය නැවත කැමැත්තෙන් ඉවත් කිරීමේ විකල්පය ලබා දිය යුතුය.
එම්බොස්

නියත වශයෙන්ම, මම කල්පනා කරමින් සිටියේ HSM ට සමාන සමහර මෘදුකාංග ක්‍රියාත්මක කිරීම මතකය පිරිසිදු කිරීම සම්බන්ධයෙන් වඩා හොඳින් හැසිරෙනු ඇත්ද යන්නයි. නිදසුනක් ලෙස, සෆාරි / ඕඑස්එක්ස් සමඟ සේවාදායක-සත්‍යාපනය භාවිතා කරන විට, සෆාරි ක්‍රියාවලිය කිසි විටෙක පුද්ගලික යතුර නොදකිනු ඇත, මෙහෙයුම් පද්ධතිය විසින් සපයනු ලබන යටි එස්එස්එල් පුස්තකාලය කෙලින්ම ආරක්ෂක ඩීමන් සමඟ කථා කරයි. මේ සියල්ල මෘදුකාංගය තුළ සිදු කර ඇති අතර, මෙවැනිම වෙන්වීමක් වෙනත් ආයතනයකට (මෘදුකාංග මත පදනම් වූ) අත්සන් තැබුවහොත් එය මතකය වඩා හොඳින් මුදා හරිනු ඇත.
un නෝ

R බ un නෝ: සිත්ගන්නාසුලු අදහස නම්, මතකය ඉවත් කිරීම ගැන සැලකිලිමත් වන අතිරේක දිශානත තට්ටුවක් මෙය විනිවිදභාවයෙන් විසඳනු ඇත. මෘදුකාංග යතුරු ගබඩාව සඳහා PKCS # 11 එතුම ලිවීමෙන් දැනටමත් උපක්‍රමය කළ හැකිද?
එම්බොස්

51

ජෝන් ස්කීට් පවසන පරිදි, පරාවර්තනය භාවිතා කිරීම හැර වෙනත් මාර්ගයක් නොමැත.

කෙසේ වෙතත්, පරාවර්තනය ඔබට විකල්පයක් නම්, ඔබට මෙය කළ හැකිය.

public static void main(String[] args) {
    System.out.println("please enter a password");
    // don't actually do this, this is an example only.
    Scanner in = new Scanner(System.in);
    String password = in.nextLine();
    usePassword(password);

    clearString(password);

    System.out.println("password: '" + password + "'");
}

private static void usePassword(String password) {

}

private static void clearString(String password) {
    try {
        Field value = String.class.getDeclaredField("value");
        value.setAccessible(true);
        char[] chars = (char[]) value.get(password);
        Arrays.fill(chars, '*');
    } catch (Exception e) {
        throw new AssertionError(e);
    }
}

ධාවනය වන විට

please enter a password
hello world
password: '***********'

සටහන: GC චක්‍රයක කොටසක් ලෙස String's char [] පිටපත් කර ඇත්නම්, පෙර පිටපත මතකයේ කොතැනක හෝ තිබීමට අවස්ථාවක් තිබේ.

මෙම පැරණි පිටපත ගොඩවල් වල නොපෙන්වයි, නමුත් ඔබට ක්‍රියාවලියේ අමු මතකයට access ජු ප්‍රවේශයක් ඇත්නම් ඔබට එය දැකිය හැකිය. පොදුවේ ඔබ එවැනි ප්‍රවේශයක් ඇති කිසිවෙකුට වැළකී සිටිය යුතුය.


2
අපට ලැබෙන මුරපදයේ දිග මුද්‍රණය වීම වැළැක්වීම සඳහා යමක් කිරීමට වඩා හොඳය '***********'.
chux - මොනිකා නැවත ස්ථාපනය කරන්න

uxchux ඔබට ශුන්‍ය පළල අක්ෂරයක් භාවිතා කළ හැකිය, මෙය ප්‍රයෝජනවත් වීමට වඩා ව්‍යාකූල විය හැකිය. අනාරක්ෂිත ලෙස භාවිතා නොකර වර්‍ග අරාවක දිග වෙනස් කළ නොහැක. ;)
පීටර් ලෝරි

5
ජාවා 8 හි නූල් අඩු කිරීම නිසා, මම සිතන්නේ එවැනි දෙයක් කිරීම ඉතා විනාශකාරී විය හැකි බවයි ... ඔබේ වැඩසටහනේ වෙනත් නූල් ඉවත් කිරීම අවසන් විය හැකිය. නොසිතූ නමුත් හැකි ...
තදබදය

1
EtPeterLawrey එය JVM තර්කයක් සමඟ සක්‍රීය කළ යුතුය, නමුත් එය පවතී. ඒ ගැන මෙතැනින් කියවිය හැකිය: blog.codecentric.de/en/2014/08/…
jamp

1
මුරපදය තවමත් Scannerඅභ්‍යන්තර බෆරයේ තිබීමට වැඩි ඉඩක් ඇති අතර , ඔබ භාවිතා නොකළ බැවින් System.console().readPassword(), කොන්සෝල කවුළුව තුළ කියවිය හැකි ආකාරයෙන්. නමුත් බොහෝ ප්‍රායෝගික භාවිත අවස්ථා සඳහා, ක්‍රියාත්මක කිරීමේ කාලසීමාව usePasswordසැබෑ ගැටළුවයි. උදා: වෙනත් යන්ත්‍රයක් සමඟ සම්බන්ධතාවයක් ඇති කර ගැනීමේදී එය සැලකිය යුතු කාලයක් ගත වන අතර ගොඩකරුවාගේ මුරපදය සෙවීමට සුදුසුම කාලය එය බව ප්‍රහාරකයාට පවසයි. එකම විසඳුම වන්නේ ප්‍රහාරකයන් ගොඩවල් මතකය කියවීම වැළැක්වීමයි…
හොල්ගර්

42

මේ සියල්ලම හේතු වේ, යමෙක් මුරපදයක් සඳහා String වෙනුවට char [] array එකක් තෝරා ගත යුතුය .

1. ජාවා හි නූල් වෙනස් කළ නොහැකි බැවින්, ඔබ මුරපදය සරල පා text යක් ලෙස ගබඩා කරන්නේ නම්, කසළ එකතු කරන්නා එය ඉවත් කරන තෙක් එය මතකයේ රැඳෙනු ඇත, සහ නැවත භාවිතා කිරීම සඳහා නූල් තටාකයේ භාවිතා කරන බැවින් එය නැවත භාවිතා කිරීම සඳහා ඉහළ අවස්ථාවක් තිබේ ආරක්ෂක තර්ජනයක් වන දිගු කාලයක් මතකයේ රැඳී සිටින්න.

මතක ඩම්ප් වෙත ප්‍රවේශය ඇති ඕනෑම කෙනෙකුට මුරපදය පැහැදිලි පා text යකින් සොයාගත හැකි බැවින්, ඔබ සැමවිටම සාමාන්‍ය පෙළට වඩා සංකේතාත්මක මුරපදයක් භාවිතා කළ යුතුය. නූල් වෙනස් කළ නොහැකි බැවින් නූල් වල අන්තර්ගතය වෙනස් කළ හැකි ක්‍රමයක් නැති නිසා ඕනෑම වෙනස්කමක් නව නූලක් නිපදවන අතර ඔබ වර්‍ගයක් භාවිතා කරන්නේ නම් ඔබට සියලු අංග හිස් හෝ ශුන්‍ය ලෙස සැකසිය හැකිය. එබැවින් මුරපදයක් අක්ෂර මාලාවක ගබඩා කිරීම මුරපදයක් සොරකම් කිරීමේ ආරක්ෂක අවදානම පැහැදිලිවම අඩු කරයි.

2. ජාවා විසින්ම නිර්දේශ කරනුයේ ආරක්‍ෂිත හේතූන් මත පැහැදිලි පා text යෙන් මුරපද ලබා දෙන ක්ෂය කළ getText () ක්‍රමය වෙනුවට වර්‍ගයක් ලබා දෙන JPasswordField හි getPassword () ක්‍රමය භාවිතා කිරීමයි. ජාවා කණ්ඩායමේ උපදෙස් පිළිපැදීම හා ඒවාට එරෙහිව යාම වෙනුවට ප්‍රමිතීන් පිළිපැදීම හොඳය.

3. නූල් සමඟ සෑම විටම ලොග් ගොනුවක හෝ කොන්සෝලයක සරල පෙළ මුද්‍රණය කිරීමේ අවදානමක් ඇත, නමුත් ඔබ අරාව භාවිතා කරන්නේ නම් ඔබ අරාවෙහි අන්තර්ගතය මුද්‍රණය නොකරනු ඇත, නමුත් ඒ වෙනුවට එහි මතක ස්ථානය මුද්‍රණය වේ. සැබෑ හේතුවක් නොවුනත් එය තවමත් අර්ථවත් කරයි.

String strPassword="Unknown";
char[] charPassword= new char[]{'U','n','k','w','o','n'};
System.out.println("String password: " + strPassword);
System.out.println("Character password: " + charPassword);

String password: Unknown
Character password: [C@110b053

මෙම බ්ලොග් අඩවියෙන් යොමු කර ඇත . මම හිතනවා මේක උදව් වෙයි කියලා.


10
මෙය අතිරික්තය. මෙම පිළිතුර @SrujanKumarGulla stackoverflow.com/a/14060804/1793718 විසින් ලියන ලද පිළිතුරේ නිශ්චිත අනුවාදයකි . කරුණාකර එකම පිළිතුර දෙවරක් පිටපත් කරන්න හෝ අනුපිටපත් නොකරන්න.
ලකී

1 අතර වෙනස කුමක්ද?) System.out.println ("චරිත මුරපදය:" + charPassword); සහ 2.) System.out.println (charPassword); මන්ද එය ප්‍රතිදානය ලෙසම “නොදන්නා” දේ ලබා දෙන බැවිනි.
වෛභව්_ශර්මා

3
Uck ලකී අවාසනාවකට ඔබ සම්බන්ධ කළ පැරණි පිළිතුර මෙම පිළිතුර මෙන් ම බ්ලොග් අඩවියෙන් ම වසංගත කර ඇති අතර දැන් මකා දමා ඇත. Meta.stackoverflow.com/questions/389144/… බලන්න . මෙම පිළිතුර එම බ්ලොග් අඩවියෙන්ම කපා අලවා කිසිවක් එකතු කර නැති නිසා එය මුල් මූලාශ්‍රය හා සම්බන්ධ වන අදහස් දැක්වීමක් විය යුතුය.
skomisa

41

සංස්කරණය කරන්න: වසරක ආරක්ෂක පර්යේෂණයකින් පසු මෙම පිළිතුර වෙත නැවත පැමිණීම, එය ඔබ සැබවින්ම සාමාන්‍ය පෙළ මුරපද සංසන්දනය කරන තරමක් අවාසනාවන්ත ඇඟවීමක් බව මම තේරුම් ගතිමි. කරුණාකරලා එපා. ලුණු සහ සාධාරණ පුනරාවර්තන සංඛ්‍යාවක් සහිත ආරක්ෂිත එක්-මාර්ග හැෂ් භාවිතා කරන්න . පුස්තකාලයක් භාවිතා කිරීම ගැන සලකා බලන්න: මෙම දේවල් නිවැරදිව ලබා ගැනීම දුෂ්කර ය!

මුල් පිළිතුර: String.equals () කෙටි පරිපථ ඇගයීමක් භාවිතා කරන අතර , එම නිසා කාල ප්‍රහාරයකට ගොදුරු විය හැකිද? එය විය නොහැක්කකි, නමුත් අක්ෂරවල නිවැරදි අනුක්‍රමය තීරණය කිරීම සඳහා ඔබට න්‍යායාත්මකව මුරපදය සංසන්දනය කළ හැකිය .

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        // Quits here if Strings are different lengths.
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            // Quits here at first different character.
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

කාල ප්‍රහාර සඳහා තවත් සම්පත් කිහිපයක්:


නමුත් එය සංසන්දනය කිරීමේදී ද විය හැකිය, කොතැනක හෝ අපි මුරපද වලංගු කිරීමේදී ද එසේ කරනු ඇත. ඉතින් වර්‍ගය [] නූල් වලට වඩා හොඳ වන්නේ කෙසේද?
මෝහිත් කන්වර්

3
ඔබ ඇත්තෙන්ම නිවැරදියි, වැරැද්ද දෙයාකාරයකින් කළ හැකිය. ජාවා හි නූල් මත පදනම් වූ හෝ වර්‍ග පදනම් කරගත් මුරපද සඳහා පැහැදිලි මුරපද-සැසඳීමේ ක්‍රමයක් නොමැති බව සලකන විට ගැටළුව ගැන දැන ගැනීම මෙහි ඇති වැදගත්ම දෙයයි. නූල් සඳහා සංසන්දනය () භාවිතා කිරීමට ඇති පෙළඹවීම වර්‍ග සමඟ යාමට හොඳ හේතුවක් යැයි මම කියමි. ඒ ආකාරයෙන් ඔබට අවම වශයෙන් සංසන්දනය සිදු කරන ආකාරය පාලනය කළ හැකිය (නූල් දිගු නොකර, එය වේදනාකාරී ඉමෝවකි).
ප්‍රස්තාර න්‍යාය

සාමාන්ය අක්ෂර පෙළේ මුරපද සංසන්දනය අමතරව කෙසේ හෝ නිවැරදි දේ නොවේ, භාවිතා කිරීමට පරික්ෂාවට Arrays.equalsසඳහා char[]සඳහා වැඩි වශයෙන් පරිදි වේ String.equals. යමෙකු සැලකිලිමත් වූයේ නම්, සත්‍ය මුරපදය ඇතුළත් කර ගැටළු ගැන සැලකිලිමත් වන කැපවූ යතුරු පන්තියක් තිබුණි - අනේ ඉන්න, සැබෑ ආරක්ෂක පැකේජවල ප්‍රධාන පන්ති වෙන් කර ඇත , මෙම ප්‍රශ්නෝත්තරය ඔවුන්ගෙන් පිටත පුරුද්දක් ගැන පමණි , උදා JPasswordField, භාවිතා කිරීමට char[]වෙනුවටString (සත්‍ය ඇල්ගොරිතම byte[]කෙසේ හෝ භාවිතා කරන තැන ).
හොල්ගර්

ආරක්‍ෂාව අදාළ මෘදුකාංගය sleep(secureRandom.nextInt())කෙසේ හෝ පිවිසීමේ උත්සාහයක් ප්‍රතික්ෂේප කිරීමට පෙර යමක් කළ යුතුය , එය කාල ප්‍රහාරයන්ට ඇති හැකියාව ඉවත් කිරීම පමණක් නොව, තිරිසන් බල උත්සාහයන්ට ප්‍රතිප්‍රහාර එල්ල කරයි.
හොල්ගර්

36

භාවිතයෙන් පසු ඔබ එය අතින් පිරිසිදු නොකරන්නේ නම්, වර්‍ග අරාව ඔබට එදිරිව එදිරිව ලබා දෙන කිසිවක් නැත, කිසිවෙකු එය කරන බව මා දැක නැත. ඉතින් මට නම් char [] vs String හි මනාපය ටිකක් අතිශයෝක්තියට නංවයි.

මෙම දෙස බලන්න පුළුල් ලෙස භාවිතා වසන්තය ආරක්ෂක පුස්තකාල මෙහි සහ ඔබ ඇසීමට, - වසන්තය ආරක්ෂක යාලුවනේ අදක්ෂ හෝ අඟුරු වේ [] මුරපද පමණක් තේරුමක් නැහැ. සමහර නපුරු හැකර් ඔබේ RAM හි මතක ඩම්ප් අල්ලා ගන්නා විට ඔබ සැඟවීමට නවීන ක්‍රම භාවිතා කළත් ඔහුට / ඔහු සියලු මුරපද ලබා ගන්නා බවට වග බලා ගන්න.

කෙසේ වෙතත්, ජාවා සෑම විටම වෙනස් වන අතර, ජාවා 8 හි String Deduplication විශේෂාංගය වැනි සමහර භයානක ලක්ෂණ ඔබේ අනුදැනුමකින් තොරව String වස්තු වලට සම්බන්ධ විය හැකිය. නමුත් එය වෙනස් සංවාදයකි.


නූල් අඩු කිරීම බියජනක වන්නේ ඇයි? එය අදාළ වන්නේ අවම වශයෙන් නූල් දෙකක් එකම අන්තර්ගතයක් ඇති විට පමණි, එබැවින් දැනටමත් සමාන නූල් දෙක එකම අරාව බෙදා ගැනීමට ඉඩ දීමෙන් ඇතිවිය හැකි අන්තරාය කුමක්ද? නැතහොත් වෙනත් ආකාරයකින් විමසීමට ඉඩ දෙන්න: නූල්-අඩු කිරීමක් නොමැති නම්, නූල් දෙකටම එකිනෙකට වෙනස් අරා (එකම අන්තර්ගතයන්ගෙන්) තිබීම නිසා ඇති වන වාසිය කුමක්ද? කෙසේ වෙතත්, එම අන්තර්ගතයන්හි දීර් living තම ජීවමාන
නූල

Control ඔබගේ පාලනයෙන් බැහැර ඕනෑම දෙයක් හොල්ගර් කිරීම අවදානමක් ඇත ... නිදසුනක් ලෙස පරිශීලකයින් දෙදෙනෙකුට එකම මුරපදයක් තිබේ නම් මෙම පුදුමාකාර අංගය ඔවුන් දෙදෙනාම එකම වර්‍ගයක ගබඩා කරනු ඇත [] ඔවුන් එක හා සමාන බව පැහැදිලිව පෙනේ, එය එසේ දැයි විශ්වාස නැත විශාල අවදානමක් නමුත් තවමත්
ඔලෙග් මිහීව්

ඔබට ගොඩවල් මතකයට සහ නූල් අවස්ථා දෙකටම ප්‍රවේශය තිබේ නම්, නූල් එකම අරාවකට හෝ එකම අන්තර්ගතයේ අරා දෙකකට යොමු වී ඇත්ද යන්න ගැටළුවක් නොවේ, සෑම එකක්ම සොයා ගැනීම පහසුය. විශේෂයෙන්, එය කෙසේ හෝ අදාළ නොවන බැවින්. ඔබ මේ මොහොතේ සිටී නම්, ඔබ සමාන වුවත් නැතත් මුරපද දෙකම අල්ලා ගනී. සත්‍ය දෝෂය වන්නේ ලුණු දැමූ හැෂ් වෙනුවට සාමාන්‍ය පෙළ මුරපද භාවිතා කිරීමයි.
හොල්ගර්

මුරපදය සත්‍යාපනය කිරීම සඳහා හොල්ජර් එය යම් කාලයක් මතකයේ පැහැදිලි පා text යක තිබිය යුතුය, 10ms, එය ලුණු දැමූ හැෂ් එකක් සෑදීමට පමණක් වුවද. එම්එස් 10 ක් සඳහා පවා සමාන මුරපද දෙකක් මතකයේ තබා ඇති බව අඩු වුවහොත්, අඩු කිරීම ක්‍රියාත්මක විය හැකිය. එය සැබවින්ම නූල් බැඳ තබන්නේ නම් ඒවා වැඩි කාලයක් මතකයේ තබා ගනී. මාස ගණනක් නැවත ආරම්භ නොකරන පද්ධතිය මේවායින් බොහොමයක් එකතු කරයි. න්‍යායාත්මක කිරීම පමණි.
ඔලෙග් මිචීව්

පෙනෙන ආකාරයට, ඔබට නූල් අඩු කිරීම පිළිබඳ මූලික වරදවා වටහා ගැනීමක් ඇත. එය “ඉන්ටර්නෙට් නූල්” නොකෙරේ, එකම අන්තර්ගතයන් සහිත නූල් එකම අරාවකට යොමු කිරීමට ඉඩ සලසයි, එමඟින් සරල පෙළ මුරපදය අඩංගු අරාව සිද්ධි ගණන අඩු කරයි , මන්ද එක් අරාව උදාහරණයක් හැර අනෙක් සියල්ල නැවත ලබා ගත හැකි අතර නැවත ලිවිය හැකිය. වහාම වෙනත් වස්තූන් විසින්. මෙම නූල් වෙනත් ඕනෑම නූල් මෙන් තවමත් එකතු කරනු ලැබේ. බහු-ජීසී චක්‍ර වලින් පමණක් නොනැසී පවතින නූල් සඳහා, කසළ එකතු කරන්නා විසින් සත්‍ය වශයෙන්ම අනුපිටපත් කිරීම සිදු කරන බව ඔබ තේරුම් ගන්නේ නම්, සමහර විට එය උපකාරී වේ.
හොල්ගර්

30

නූල් වෙනස් නොවන අතර ඒවා නිර්මාණය කිරීමෙන් පසු වෙනස් කළ නොහැක. මුරපදයක් නූලක් ලෙස සෑදීමෙන් මුරපදය වෙත සංචිතයේ හෝ සංගීත තටාකයේ අයාලේ යොමුවනු ඇත. දැන් යමෙකු ජාවා ක්‍රියාවලියේ විශාල ප්‍රමාණයක් ගෙන ප්‍රවේශමෙන් පරිලෝකනය කළහොත් ඔහුට මුරපද අනුමාන කළ හැකිය. ඇත්ත වශයෙන්ම මෙම භාවිතා නොකරන නූල් එකතු කරනු ලබන්නේ කසළ එකතු කරන නමුත් එය රඳා පවතින්නේ GC ආරම්භ වන විටය.

සත්‍යාපනය කළ විගස අනෙක් පැත්තේ වර්‍ගය විකෘති වේ, ඔබට ඒවා එම් හෝ බැක්ස්ලෑෂ් වැනි ඕනෑම අක්ෂරයකින් නැවත ලිවිය හැකිය. දැන් යමෙකු ගොඩවල් කුණු කූඩයක් ගත්තද, දැනට භාවිතයේ නොමැති මුරපද ලබා ගැනීමට ඔහුට නොහැකි වනු ඇත. මෙය ඔබට වැඩි පාලනයක් ලබා දෙන්නේ වස්තුවේ අන්තර්ගතය ඔබම ඉවත් කර ගැනීම හා එදිරිව ජී.සී.


ඔවුන් GC'd වනුයේ ප්‍රශ්නයේ ඇති JVM> 1.6 නම් පමණි. 1.7 ට පෙර, සියළුම නූල් පර්ම්ජන් තුළ ගබඩා කර ඇත.
avgvstvs

gavgvstvs: “සියලුම නූල් පර්ම්ජන් තුළ ගබඩා කර තිබීම” වැරදිය. එහි ගබඩා කර ඇත්තේ නූල් පමණක් වන අතර ඒවා කේතයෙන් සඳහන් කර ඇති වචනාර්ථයෙන් ආරම්භ නොවන්නේ නම්, ඒවා තවමත් කුණු එකතු කරනු ලැබේ. ඒ ගැන මදක් සිතා බලන්න. 1.7 ට පෙර සාමාන්‍යයෙන් ජේවීඑම් වල නූල් කිසි විටෙකත් ජීසී නොකළේ නම්, ඕනෑම ජාවා යෙදුමක් මිනිත්තු කිහිපයකට වඩා නොනැසී පවතින්නේ කෙසේද?
හොල්ගර්

Ol හොල්ගර් මෙය අසත්‍යයකි. සිර stringsහා Stringතටාකය (මීට පෙර භාවිතා නූල් සංචිතයක්) දෙවර්ගයේ ම 1.7 පෙර Permgen තුළ ගබඩා කර ඇත. එසේම, 5.1 කොටස බලන්න: docs.oracle.com/javase/specs/jvms/se6/html/… ජේවීඑම් සෑම විටම Stringsඑකම විමර්ශන අගයක් දැයි පරීක්ෂා කර බැලූ අතර String.intern()ඔබ අමතනු ඇත. මෙහි constant_poolප්‍රති result ලය වූයේ ජේවීඑම් එකෙහි හෝ ගොඩවල සමාන නූල් හඳුනාගත් සෑම අවස්ථාවකම එය පර්ම්ජන් වෙතට ගෙන යාමයි. මම 1.7 වන තෙක් "බඩගා යන පර්මන්" සමඟ යෙදුම් කිහිපයක වැඩ කළෙමි. එය සැබෑ ගැටළුවක් විය.
avgvstvs

එබැවින් නැවත කියවීම සඳහා: 1.7 වන තෙක්, ගොඩවල්වල නූල් ආරම්භ වූ අතර, ඒවා භාවිතා කරන විට ඒවා constant_poolපර්ම්ජන් හි පිහිටා ඇති ස්ථානයට දමා ඇති අතර, එක් වරකට වඩා නූලක් භාවිතා කරන්නේ නම්, එය අන්තර් ගත වේ.
avgvstvs

gavgvstvs: “කලින් භාවිතා කළ නූල් සංචිතයක්” නොමැත. ඔබ සම්පූර්ණයෙන්ම වෙනස් දේවල් එකට විසි කරනවා. එක් ධාවන කාල නූල් තටාකයක් ඇත. සෑම පන්තියකම එහි නියත සංචිතය සංයුක්ත කාල නියතයන් අඩංගු වේ. මෙම නූල් ස්වයංක්‍රීයව ධාවන කාල සංචිතයට එකතු වේ, නමුත් මේවා පමණක් නොව , සෑම නූලකටම නොවේ.
හොල්ගර්

21

නූල් වෙනස් නොවන අතර එය නූල් තටාකයට යයි. ලිවීමෙන් පසු එය නැවත ලිවිය නොහැක.

char[] ඔබ මුරපදය භාවිතා කළ පසු නැවත ලිවිය යුතු අරාවකි, එය කළ යුත්තේ මෙයයි:

char[] passw = request.getPassword().toCharArray()
if (comparePasswords(dbPassword, passw) {
 allowUser = true;
 cleanPassword(passw);
 cleanPassword(dbPassword);
 passw=null;
}

private static void cleanPassword (char[] pass) {

Arrays.fill(pass, '0');
}

ප්‍රහාරකයාට එය භාවිතා කළ හැකි එක් අවස්ථාවක් වන්නේ කඩාවැටීමකි - ජේවීඑම් බිඳ වැටී මතක ඩම්ප් එකක් ජනනය කරන විට - ඔබට මුරපදය දැකගත හැකිය.

එය අනිෂ්ට බාහිර ප්‍රහාරකයෙකු නොවේ. මෙය අධීක්ෂණ අරමුණු සඳහා සේවාදායකයට ප්‍රවේශය ඇති සහායක පරිශීලකයෙකු විය හැකිය. ඔහුට කඩාවැටීමකට ගොස් මුරපද සොයාගත හැකිය.


2
ch = ශූන්‍ය; ඔබට මෙය කළ නොහැක
යුගර්ටන්

නමුත් request.getPassword()දැනටමත් නූල් සාදා එය තටාකයට එකතු කරන්නේ නැද්ද?
Tvde1

1
ch = '0'දේශීය විචල්‍යය වෙනස් කරයි ch; එය අරාව කෙරෙහි කිසිදු බලපෑමක් ඇති නොකරයි. කෙසේ වෙතත් ඔබේ උදාහරණය අර්ථ විරහිත ය, ඔබ ආරම්භ කරන නූල් උදාහරණයකින් ආරම්භ toCharArray()කර, නව අරාවක් නිර්මාණය කරන අතර ඔබ නව අරාව නිවැරදිව නැවත ලියන විට පවා එය නූල් උදාහරණය වෙනස් නොකරයි, එබැවින් එය නූල් භාවිතා කිරීමෙන් පමණක් වාසියක් නැත. උදාහරණයක් ලෙස.
හොල්ගර්

Ol හොල්ගර් ස්තූතියි. වර්‍ග අරාව පිරිසිදු කිරීමේ කේතය නිවැරදි කරන ලදි.
ACV

3
ඔබට සරලව භාවිතා කළ හැකියArrays.fill(pass, '0');
හොල්ගර්

18

කෙටි හා සෘජු පිළිතුර වනුයේ char[]විකෘති වන අතරString වස්තූන් නොමැති .

Stringsජාවා හි වෙනස් කළ නොහැකි වස්තු වේ. නිර්මාණය කිරීමෙන් පසු ඒවා වෙනස් කළ නොහැකි වන්නේ එබැවිනි. එබැවින් ඒවායේ අන්තර්ගතය මතකයෙන් ඉවත් කිරීමට ඇති එකම ක්‍රමය වන්නේ කසළ එකතු කිරීමයි. එය සිදුවන්නේ වස්තුවෙන් නිදහස් වූ මතකය නැවත ලිවීමට හැකි වූ විට පමණක් වන අතර දත්ත නැති වී යයි.

දැන් ජාවා හි කසළ එකතු කිරීම කිසිදු සහතික කළ කාල පරාසයකින් සිදු නොවේ. එමString අනුව දීර් memory කාලයක් මතකයේ රැඳී සිටිය හැකි අතර, මෙම කාලය තුළ ක්‍රියාවලියක් බිඳ වැටුණහොත්, නූලෙහි අන්තර්ගතය මතක ඩම්ප් හෝ යම් ලොගයකින් අවසන් විය හැකිය.

අක්ෂර පෙළක් සමඟ , ඔබට මුරපදය කියවිය හැකිය, ඔබට හැකි ඉක්මනින් එය සමඟ වැඩ කිරීම අවසන් කරන්න, ඉන්පසු වහාම අන්තර්ගතය වෙනස් කරන්න.


alfallenidol කොහෙත්ම නැහැ. ප්රවේශමෙන් කියවන්න, එවිට ඔබට වෙනස්කම් සොයාගත හැකිය.
ප්‍රිතම් බැනර්ජි

12

ජාවා වල නූල් වෙනස් කළ නොහැක. එබැවින් නූලක් නිර්මාණය කරන සෑම විටම එය කසළ එකතු වන තෙක් මතකයේ රැඳෙනු ඇත. එබැවින් මතකයට ප්‍රවේශය ඇති ඕනෑම කෙනෙකුට නූලෙහි වටිනාකම කියවිය හැකිය.
නූලෙහි අගය වෙනස් කර ඇත්නම් එය නව නූලක් නිර්මාණය කරයි. එබැවින් මුල් වටිනාකම සහ වෙනස් කළ අගය යන දෙකම කසළ එකතු වන තෙක් මතකයේ රැඳේ.

අක්ෂර අරාව සමඟ, මුරපදයේ අරමුණ ඉටු වූ පසු අරාවෙහි අන්තර්ගතය වෙනස් කිරීමට හෝ මකා දැමීමට හැකිය. අරාවෙහි මුල් අන්තර්ගතය වෙනස් කිරීමෙන් පසුව සහ කසළ එකතු කිරීමට පෙර පවා මතකයේ සොයාගත නොහැක.

ආරක්ෂක අවශ්‍යතා නිසා මුරපදය අක්ෂර අරාවක් ලෙස ගබඩා කිරීම වඩා හොඳය.


2

මේ සඳහා ඔබ නූල් භාවිතා කළ යුතුද නැතහොත් චාර් [] භාවිතා කළ යුතුද යන්න විවාදාත්මක ය. එය පරිශීලකයාට අවශ්‍ය දේ මත රඳා පවතී.

ජාවා හි නූල් වෙනස් කළ නොහැකි බැවින්, සමහරු ඔබේ නූල් හැසිරවීමට උත්සාහ කරන සෑම විටම එය නව වස්තුවක් නිර්මාණය කරන අතර පවතින නූල් වලට කිසිදු බලපෑමක් සිදු නොවේ. මුරපදයක් සංගීත භාණ්ඩයක් ලෙස ගබඩා කිරීමේ වාසියක් ලෙස මෙය දැකිය හැකි නමුත් භාවිතයෙන් පසුව පවා වස්තුව මතකයේ රැඳේ. එබැවින් යමෙකුට කෙසේ හෝ වස්තුවේ මතක ස්ථානය ලැබුනේ නම්, එම පුද්ගලයාට එම ස්ථානයේ ගබඩා කර ඇති ඔබගේ මුරපදය පහසුවෙන් සොයාගත හැකිය.

චාර් [] විකෘති වන නමුත් එය භාවිතා කිරීමෙන් පසු ක්‍රමලේඛකයාට අරාව පැහැදිලිවම පිරිසිදු කිරීමට හෝ අගයන් ඉක්මවා යාමට හැකිය. එබැවින් එය භාවිතා කිරීමෙන් පසු එය පිරිසිදු කර ඇති අතර ඔබ ගබඩා කර ඇති තොරතුරු ගැන කිසිවෙකුට දැනගත නොහැක.

ඉහත තත්වයන් මත පදනම්ව, යමෙකුට ඔවුන්ගේ අවශ්‍යතා සඳහා ස්ට්‍රිං සමඟ යා යුතුද නැතිනම් චාර් සමඟ යා යුතුද යන්න පිළිබඳ අදහසක් ලබා ගත හැකිය.


0

සිද්ධි නූල්:

    String password = "ill stay in StringPool after Death !!!";
    // some long code goes
    // ...Now I want to remove traces of password
    password = null;
    password = "";
    // above attempts wil change value of password
    // but the actual password can be traced from String pool through memory dump, if not garbage collected

නඩුව CHAR ARRAY:

    char[] passArray = {'p','a','s','s','w','o','r','d'};
    // some long code goes
    // ...Now I want to remove traces of password
    for (int i=0; i<passArray.length;i++){
        passArray[i] = 'x';
    }
    // Now you ACTUALLY DESTROYED traces of password form memory
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.