Neden char [], ┼čifreler i├žin String'den daha ├žok tercih edilir?


Al─▒nan cevaba git


Sal─▒ncak olarak, ┼čifre alan─▒ bir sahiptir getPassword() (d├Âner char[] yerine her zamanki) y├Ântemine getText() (d├Âner String ) y├Ântemiyle. Benzer ┼čekilde, String ┼čifreleri ele almamak i├žin bir ├Âneriyle kar┼č─▒la┼čt─▒m .

String ┼×ifreler s├Âz konusu oldu─čunda neden g├╝venlik a├ž─▒s─▒ndan bir tehdit olu┼čturuyor? Kullan─▒m─▒ sak─▒ncal─▒d─▒r char[] .


3266









Cevap say─▒s─▒n─▒ say: 16






Dizeler de─či┼čmez . Bu, bir kez olu┼čturdu─čunuzda, String ba┼čka bir i┼člem bellek d├Âkebiliyorsa, ├ž├Âp toplama i┼člemi ba┼člamadan ├Ânce verilerden kurtulman─▒n hi├žbir yolu yoktur ( yans─▒ma d─▒┼č─▒nda ) .https://en.wikipedia.org/wiki/Garbage_collection_%2528computer_science%2529

Bir diziyle, i┼činiz bittikten sonra verileri a├ž─▒k├ža silebilirsiniz. ─░stedi─činiz herhangi bir ┼čeyle dizinin ├╝zerine yazabilirsiniz ve parola ├ž├Âp toplamadan ├Ânce bile sistemin hi├žbir yerinde g├Âr├╝nmez.

Yani evet, bu ise bir g├╝venlik endi┼česi - ancak bu bile kullanarak char[] sadece bir sald─▒rgan─▒n f─▒rsat penceresi azalt─▒r ve sadece sald─▒r─▒ bu ├Âzel tip i├žin.

Yorumlarda belirtildi─či gibi, ├ž├Âp toplay─▒c─▒ taraf─▒ndan ta┼č─▒nan dizilerin bellekte verilerin ba┼č─▒bo┼č kopyalar─▒n─▒ b─▒rakmas─▒ m├╝mk├╝nd├╝r. Ben bu ger├žeklenime ├Âzel inan─▒yoruz - ├ç├Âp toplay─▒c─▒ olabilir gidiyor, b├╝t├╝n haf─▒zay─▒ temizlemek bu t├╝r bir ┼čey ├Ânlemek i├žin. Olsa bile char[] , as─▒l karakterleri sald─▒r─▒ penceresi olarak i├žerdi─či zaman hala vard─▒r .


4141







Buradaki di─čer ├Âneriler ge├žerli g├Âr├╝nmekle birlikte, ba┼čka bir iyi sebep var. D├╝z String ile yanl─▒┼čl─▒kla g├╝nl├╝kleri , monit├Ârler veya ba┼čka bir g├╝vensiz yere parolay─▒ yazd─▒rma ┼čans─▒n─▒z ├žok daha y├╝ksek . char[] daha az savunmas─▒zd─▒r.

Bunu d├╝┼č├╝n:

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

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

Bask─▒lar:

 String: Password
Array: [[email protected]
 

1182







Resmi bir belge al─▒nt─▒ i├žin, Java Kriptografi Mimarl─▒k k─▒lavuzu hakk─▒nda ┼čunlar─▒ s├Âyler char[] vs String (┼čifre tabanl─▒ ┼čifreleme hakk─▒nda, ancak bu elbette ┼čifreler hakk─▒nda daha genel olarak) ┼čifreleri:

┼×ifreyi bir t├╝r nesnede toplamak ve saklamak mant─▒kl─▒ g├Âr├╝nebilir java.lang.String . Bununla birlikte, buradaki uyar─▒: Object s tipi String de─či┼čmezdir, yani bir String kullan─▒mdan sonra i├žeri─čini de─či┼čtirmenize (├╝zerine yazma) veya s─▒f─▒rlaman─▒za izin veren hi├žbir y├Ântem yoktur . Bu ├Âzellik, String kullan─▒c─▒ parolalar─▒ gibi g├╝venlik a├ž─▒s─▒ndan hassas bilgilerin depolanmas─▒ i├žin uygun olmayan nesneleri yapar . G├╝venlik duyarl─▒ bilgileri her zaman bir char dizide toplay─▒p saklaman─▒z gerekir .

Java Programlama Dili i├žin G├╝venli Kodlama Rehberinin 2-2 numaral─▒ Y├Ânergesi, S├╝r├╝m 4.0 da benzer bir ┼čey s├Âylemektedir (ba┼člang─▒├žta g├╝nl├╝k kayd─▒ ba─člam─▒nda olmas─▒na ra─čmen):

Y├Ânerge 2-2: ├çok hassas bilgileri g├╝nl├╝─če kaydetmeyin

Sosyal G├╝venlik numaralar─▒ (SSN'ler) ve ┼čifreler gibi baz─▒ bilgiler olduk├ža hassast─▒r. Bu bilgiler gerekenden daha uzun, ne de g├Âr├╝lebiliyorsa y├Âneticiler taraf─▒ndan bile saklanmamal─▒d─▒r. ├ľrne─čin, g├╝nl├╝k dosyalar─▒na g├Ânderilmemeli ve varl─▒─č─▒ aramalar yoluyla tespit edilememelidir. Baz─▒ ge├žici veriler, karakter dizileri gibi de─či┼čken veri yap─▒lar─▒nda tutulabilir ve kullan─▒mdan hemen sonra temizlenebilir. Veri yap─▒lar─▒n─▒n silinmesi, nesnelerin programlay─▒c─▒ya ┼čeffaf bir ┼čekilde bellekte ta┼č─▒nmas─▒ nedeniyle tipik Java ├žal─▒┼čma zaman─▒ sistemlerinde etkinli─či azaltm─▒┼čt─▒r.

Bu k─▒lavuzun, ele ald─▒klar─▒ veriler hakk─▒nda anlamsal bilgiye sahip olmayan alt d├╝zey kitapl─▒klar─▒n uygulanmas─▒ ve kullan─▒m─▒ i├žin de etkileri vard─▒r. ├ľrnek olarak, d├╝┼č├╝k seviyeli bir dize ayr─▒┼čt─▒rma k├╝t├╝phanesi ├╝zerinde ├žal─▒┼čt─▒─č─▒ metni kaydedebilir. Bir uygulama k├╝t├╝phane ile bir SSN'yi ayr─▒┼čt─▒rabilir. Bu, SSN'lerin g├╝nl├╝k dosyalar─▒na eri┼čebilen y├Âneticiler taraf─▒ndan kullan─▒labilir oldu─ču bir durum yarat─▒r.


665







Karakter dizileri ( char[] ) kullan─▒mdan sonra her bir karakteri s─▒f─▒ra ayarlayarak ve Dizgiler de─čil olarak temizlenebilir. Birisi haf─▒za g├Âr├╝nt├╝s├╝n├╝ bir ┼čekilde g├Ârebiliyorsa, Dizeler kullan─▒l─▒rsa d├╝z metin olarak bir parola g├Ârebilir, ancak char[] kullan─▒l─▒yorsa, verileri 0 s ile temizledikten sonra parola g├╝venlidir.


341







Baz─▒ insanlar, art─▒k ihtiyac─▒n─▒z olmad─▒─č─▒nda ┼čifreyi saklamak i├žin kullan─▒lan haf─▒zan─▒n ├╝zerine yazman─▒z gerekti─čine inanmaktad─▒r. Bu, bir sald─▒rgan─▒n sisteminizden ┼čifreyi okumas─▒ gereken zaman penceresini azalt─▒r ve sald─▒rgan─▒n JVM haf─▒zas─▒n─▒ ka├ž─▒rmak i├žin zaten yeterli eri┼čime ihtiyac─▒ oldu─ču ger├že─čini tamamen g├Ârmezden gelir. Bu kadar eri┼čime sahip bir sald─▒rgan bu olaylar─▒ tamamen i┼če yaramaz hale getirerek kilit olaylar─▒n─▒z─▒ yakalayabilir (AFAIK, l├╝tfen hatal─▒ysam beni d├╝zeltin).

G├╝ncelle┼čtirme

Yorumlar sayesinde cevab─▒m─▒ g├╝ncellemem gerekiyor. G├Âr├╝n├╝┼če g├Âre, bir parolan─▒n sabit s├╝r├╝c├╝ye y├╝klenece─či s├╝reyi azaltt─▒─č─▒ i├žin (├žok) k├╝├ž├╝k bir g├╝venlik iyile┼čtirmesi ekleyebilece─či iki durum var. Yine de ├žo─ču kullan─▒m durumunun a┼č─▒r─▒ oldu─čunu d├╝┼č├╝n├╝yorum.

  • Hedef sisteminiz k├Ât├╝ bir ┼čekilde yap─▒land─▒r─▒lm─▒┼č olabilir veya bunun varsay─▒ld─▒─č─▒n─▒ varsayman─▒z gerekebilir ve ├žekirdek d├Âk├╝mleri konusunda paranoyak olman─▒z gerekir (sistemler bir y├Ânetici taraf─▒ndan y├Ânetilmezse ge├žerli olabilir).
  • TrueCrypt (├╝retilmiyor), VeraCrypt veya CipherShed gibi ┼čeyleri kullanarak, sald─▒rgan─▒n donan─▒ma eri┼čim sa─člamas─▒yla veri s─▒z─▒nt─▒s─▒n─▒ ├Ânlemek i├žin yaz─▒l─▒m─▒n─▒z─▒n a┼č─▒r─▒ paranoyak olmas─▒ gerekir .

M├╝mk├╝nse, ├žekirdek d├Âk├╝mlerini ve takas dosyas─▒n─▒ devre d─▒┼č─▒ b─▒rakmak her iki soruna da bakar. Ancak, y├Ânetici haklar─▒na ihtiya├ž duyacaklar ve i┼člevselli─či azaltabilecek (daha az bellek kullanacaklar) ve RAM'i ├žal─▒┼čan bir sistemden ├žekmek hala ge├žerli bir endi┼če olabilir.


213







Bunun ge├žerli bir ├Âneri oldu─čunu sanm─▒yorum, ancak en az─▒ndan nedenini tahmin edebilirim.

Bence motivasyon, ┼čifredeki t├╝m izleri derhal ve kulland─▒ktan sonra kesin olarak silebilmenizi sa─člamak istiyor. Bir ile char[] , dizinin her bir eleman─▒n─▒n ├╝zerine bo┼č veya ba┼čka bir ┼čey eklenebilir. Bu String yolun i├ž de─čerini d├╝zenleyemezsiniz .

Ancak bu tek ba┼č─▒na iyi bir cevap de─čildir; Neden sadece bir referans oldu─čundan char[] veya String ka├žmad─▒─č─▒ndan emin olmuyorsunuz? O zaman g├╝venlik sorunu yok. Fakat mesele ┼ču ki, String nesneler intern() teoride kurulabilir ve sabit havuzun i├žinde canl─▒ tutulabilir. San─▒r─▒m char[] bu olas─▒l─▒─č─▒ yasakl─▒yor.


85







Cevap ├žoktan verildi, ancak son zamanlarda Java standart kitapl─▒klar─▒yla ke┼čfetti─čim bir sorunu payla┼čmak istiyorum. Parola dizgilerini char[] her yerle (elbette iyi bir ┼čeydir) de─či┼čtirmek yerine ┼čimdi ├žok dikkatli olsalar da , g├╝venlik a├ž─▒s─▒ndan ├Ânemli olan di─čer veriler bellekten silinmeye gelince g├Âz ard─▒ ediliyor.

├ľrne─čin PrivateKey s─▒n─▒f─▒n─▒ d├╝┼č├╝n├╝yorum . Baz─▒ i┼člemleri ger├žekle┼čtirmek i├žin kullanarak PKCS # 12 dosyas─▒ndan ├Âzel bir RSA anahtar─▒ y├╝kleyebilece─činiz bir senaryo d├╝┼č├╝n├╝n. ┼×imdi bu durumda, parolan─▒n tek ba┼č─▒na koklanmas─▒, anahtar dosyaya fiziksel eri┼čimin do─čru ┼čekilde k─▒s─▒tlanmas─▒ ┼čart─▒yla size yard─▒mc─▒ olmaz. Sald─▒rgan olarak, anahtar─▒ do─črudan parola yerine ald─▒ysan─▒z ├žok daha iyi bir durumda olursunuz. ─░stenilen bilgi s─▒zd─▒rabilir manifold, ├žekirdek d├Âk├╝mleri, bir hata ay─▒klay─▒c─▒ oturumu veya takas dosyalar─▒ sadece baz─▒ ├Ârneklerdir.

Ve ortaya ├ž─▒kt─▒─č─▒ gibi, ├Âzel bir bilgiyi PrivateKey bellekten temizlemenizi sa─člayan hi├žbir ┼čey yoktur, ├ž├╝nk├╝ kar┼č─▒l─▒k gelen bilgiyi olu┼čturan baytlar─▒ silmenize izin veren hi├žbir API yoktur.

Bu k├Ât├╝ bir durumdur, ├ž├╝nk├╝ bu makale bu durumun potansiyel olarak nas─▒l yararlan─▒labilece─čini a├ž─▒klamaktad─▒r.

├ľrne─čin OpenSSL k├╝t├╝phanesi, ├Âzel anahtarlar serbest b─▒rak─▒lmadan ├Ânce kritik bellek b├Âl├╝mlerinin ├╝zerine yazar. Java ├ž├Âp topland─▒─č─▒ndan, anahtarlar─▒ kulland─▒ktan hemen sonra uygulanacak olan Java anahtarlar─▒ i├žin ├Âzel bilgileri silmek ve ge├žersiz k─▒lmak i├žin a├ž─▒k y├Ântemlere ihtiyac─▒m─▒z olacakt─▒r.


65







Jon Skeet'in belirtti─či gibi, yans─▒ma kullanmaktan ba┼čka yolu yoktur.

Ancak, yans─▒ma sizin i├žin bir se├ženekse, bunu yapabilirsiniz.

 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);
    }
}
 

ka├žt─▒─č─▒nda

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

Not: String'in [] karakteri GC d├Âng├╝s├╝n├╝n bir par├žas─▒ olarak kopyalanm─▒┼čsa, ├Ânceki kopyan─▒n bellekte bir yerde olmas─▒ ihtimali vard─▒r.

Bu eski kopya bir y─▒─č─▒n d├Âk├╝m├╝ i├žinde g├Âr├╝nmez, ancak i┼člemin ham belle─čine do─črudan eri┼čiminiz varsa, onu g├Ârebilirsiniz. Genelde b├Âyle bir eri┼čimi olan herhangi birinden ka├ž─▒nmal─▒s─▒n─▒z.


50







B├╝t├╝n bu sebepler, ┼čifre yerine String yerine char [] dizisi se├žilmeli .

1. Dizeler Java'da de─či┼čmez oldu─ču i├žin, ┼čifreyi d├╝z metin olarak saklarsan─▒z, ├ç├Âp toplay─▒c─▒s─▒ onu temizleyene kadar bellekte kullan─▒labilir ve Dize havuzunda yeniden kullan─▒labilirlik i├žin Dize havuzunda kullan─▒ld─▒─č─▒ndan, olduk├ža y├╝ksek bir olas─▒l─▒k olacakt─▒r. G├╝venlik tehdidi olu┼čturan uzun s├╝re bellekte kal─▒r.

Bellek d├Âk├╝m├╝ne eri┼čimi olan herkes ┼čifreyi a├ž─▒k bir ┼čekilde bulabildi─činden, bu, her zaman d├╝z metin yerine ┼čifreli bir ┼čifre kullanman─▒z─▒n ba┼čka bir nedenidir. Dizeler de─či┼čmez oldu─ču i├žin Dizelerin i├žeri─či de─či┼čtirilemez, ├ž├╝nk├╝ herhangi bir de─či┼čiklik yeni bir Dize ├╝retecektir, oysa bir karakter [] kullan─▒rsan─▒z, hala t├╝m ├Â─čeleri bo┼č veya s─▒f─▒r olarak ayarlayabilirsiniz. Bu y├╝zden bir karakter dizisinde bir parola saklamak, bir parola ├žalma g├╝venlik riskini a├ž─▒k├ža azalt─▒r.

2. Java'n─▒n kendisi, g├╝venlik nedenlerini a├ž─▒k bir ┼čekilde belirten parolalar─▒ d├Ând├╝ren kullan─▒mdan kald─▒r─▒lm─▒┼č getText () y├Ânteminin yerine bir karakter d├Ând├╝ren JPasswordField y├Ânteminin getPassword () y├Ântemini kullanman─▒z─▒ ├Ânerir. Java ekibinin tavsiyelerine uymak ve onlara kar┼č─▒ ├ž─▒kmak yerine standartlara uymak iyidir.

3. String ile her zaman g├╝nl├╝k dosyas─▒nda veya konsolunda d├╝z metin basma riski vard─▒r, ancak Dizi kullan─▒yorsan─▒z dizinin i├žeri─čini yazd─▒rmazs─▒n─▒z, ancak bunun yerine bellek konumu yazd─▒r─▒l─▒r. Ger├žek bir sebep olmasa da, hala mant─▒kl─▒ geliyor.

 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: [[email protected]
 

Bu blogdan referans al─▒nm─▒┼čt─▒r . Umar─▒m bu yard─▒mc─▒ olur.


43







D├╝zenleme: Bir y─▒l s├╝ren bir g├╝venlik ara┼čt─▒rmas─▒ndan sonra bu cevaba geri d├Ând├╝─č├╝mde, d├╝z metin parolalar─▒n─▒ ger├žekten kar┼č─▒la┼čt─▒rman─▒z─▒n ne kadar talihsiz bir sonu├ž verdi─čini biliyorum. L├╝tfen yapma Tuz ve makul say─▒da yineleme ile g├╝venli bir tek y├Ânl├╝ karma kullan─▒n . Bir k├╝t├╝phane kullanmay─▒ d├╝┼č├╝n├╝n: bu ┼čeyi do─čru yapmak zordur!

Orijinal cevap: Peki String.equals () 'in k─▒sa devre de─čerlendirmesini kullanmas─▒ ve bu nedenle zamanlama sald─▒r─▒s─▒na kar┼č─▒ savunmas─▒z olmas─▒ ger├že─činden ne haber ? Muhtemel olmayabilir, ancak do─čru karakter s─▒ras─▒n─▒ belirlemek i├žin teorik olarak ┼čifre kar┼č─▒la┼čt─▒rmas─▒n─▒ zamanlayabilirsiniz.

 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;
}
 

Zamanlama sald─▒r─▒lar─▒yla ilgili daha fazla kaynak:


41







Kulland─▒ktan sonra elle temizlemedi─činiz s├╝rece char dizisinin size String'e verdi─či hi├žbir ┼čey yoktur ve asl─▒nda bunu yapan birini g├Ârmedim. Bu y├╝zden bana g├Âre char [] vs String'in tercihi biraz abart─▒l─▒.

Burada yayg─▒n olarak kullan─▒lan Spring Security k├╝t├╝phanesine bir g├Âz at─▒n ve kendinize sorun - Spring Security'in beceriksiz veya karakterli [] ┼čifreleri pek mant─▒kl─▒ de─čil mi. Baz─▒ k├Ât├╝ hackerlar RAM'inizin bellek y─▒─č─▒nlar─▒n─▒ kapt─▒─č─▒nda, bunlar─▒ gizlemek i├žin karma┼č─▒k yollar kullan─▒yor olsan─▒z bile t├╝m ┼čifreleri alaca─č─▒ndan emin olun.http://grepcode.com/file/repo1.maven.org/maven2/org.springframework.security/spring-security-web/3.0.1.RELEASE/org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter.java#73

Bununla birlikte, Java her zaman de─či┼čir ve Java 8'in String Deduplication ├Âzelli─či gibi baz─▒ korkutucu ├Âzellikleri , bilginiz olmadan dize nesneleri alabilir. Ama bu farkl─▒ bir konu┼čma.


34







Dizeler de─či┼čmez ve olu┼čturulduktan sonra de─či┼čtirilemezler. Dize olarak bir parola olu┼čturmak, y─▒─č─▒ntaki veya Dize havuzundaki parolaya ba┼č─▒bo┼č referanslar b─▒rakacakt─▒r. ┼×imdi e─čer birisi Java s├╝recine bir y─▒─č─▒n d├Âk├╝m├╝ al─▒rsa ve dikkatlice tarad─▒─č─▒nda ┼čifreleri tahmin edebilir. Elbette bu kullan─▒lmayan ipler ├ž├Âp toplanacak ancak bu GC'nin ne zaman devreye girdi─čine ba─čl─▒.

Di─čer tarafta char [], do─črulama yap─▒ld─▒ktan hemen sonra de─či┼čtirilebilir, t├╝m M veya ters e─čik ├žizgiler gibi herhangi bir karakterin ├╝zerine yazabilirsiniz. Birisi bir y─▒─č─▒n d├Âk├╝m├╝ olsa bile, ┼ču anda kullan─▒lmayan ┼čifreleri alamayabilir. Bu, GC'nin yapmas─▒n─▒ beklerken vs Object i├žeri─čini kendiniz temizlemeniz gibi anlamda daha fazla kontrol sa─člar.


30


2015-07-28





K─▒sa ve anla┼č─▒l─▒r cevap, nesneler olmasa char[] da de─či┼čkendir ├ž├╝nk├╝ olacakt─▒r String .

Strings Java'da de─či┼čmez nesnelerdir. Bu y├╝zden bir kez yarat─▒ld─▒klar─▒ i├žin de─či┼čtirilemezler ve bu nedenle i├žeriklerinin bellekten kald─▒r─▒lmas─▒n─▒n tek yolu ├ž├Âpleri toplamakt─▒r. Ancak o zaman, nesne taraf─▒ndan serbest b─▒rak─▒lan haf─▒zan─▒n ├╝zerine yaz─▒labilinir ve veriler kaybolur.

Art─▒k Java'da ├ž├Âp toplama herhangi bir garantili aral─▒kta ger├žekle┼čmiyor. B├Âylelikle String kutu uzun s├╝re bellekte kalabilir ve bu s├╝re zarf─▒nda bir i┼člem ├ž├Âkerse, dizenin i├žeri─či bir bellek d├Âk├╝m├╝ veya bir miktar k├╝t├╝─če d├╝┼čebilir.

Bir karakter dizisiyle , ┼čifreyi okuyabilir, en k─▒sa s├╝rede onunla ├žal─▒┼čmay─▒ bitirebilir ve ard─▒ndan i├žeri─či hemen de─či┼čtirebilirsiniz.


17







String de─či┼čmez ve string havuzuna gider. Bir kez yaz─▒ld─▒─č─▒nda, ├╝zerine yaz─▒lamaz.

char[] parolay─▒ kulland─▒ktan sonra ├╝zerine yazman─▒z gereken bir dizidir ve bu ┼čekilde yap─▒lmas─▒ gerekir:

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

private static void cleanPassword (char[] pass) {
 for (char ch: pass) {
  ch = '0';
 }
}
 

Sald─▒rgan─▒n kullanabilece─či bir senaryo bir ├ž├Âk├╝┼č d├Âk├╝m├╝d├╝r - JVM ├ž├Âkt├╝─č├╝nde ve bir bellek d├Âk├╝m├╝ olu┼čturdu─čunda - ┼čifreyi g├Ârebileceksiniz.

Bu mutlaka zararl─▒ bir d─▒┼č sald─▒rgan de─čildir. Bu, izleme amac─▒yla sunucuya eri┼čimi olan bir destek kullan─▒c─▒s─▒ olabilir. Bir ├ž├Âk├╝┼č i├žine g├Âz at─▒p ┼čifreleri bulabilirdi.


17


2018-04-25





Java'daki dize de─či┼čmez. Her ne zaman bir string yarat─▒ld─▒─č─▒nda, ├ž├Âp toplanana kadar haf─▒zada kalacakt─▒r. B├Âylece belle─če eri┼čimi olan herkes dizenin de─čerini okuyabilir.
Dizenin de─čeri de─či┼čtirildiyse, o zaman yeni bir dizge olu┼čturacakt─▒r. B├Âylece hem orijinal de─čer hem de de─či┼čtirilen de─čer, toplan─▒ncaya kadar bellekte kal─▒r.

Karakter dizisi ile, dizinin i├žeri─či, ┼čifrenin amac─▒ sunulduktan sonra de─či┼čtirilebilir veya silinebilir. Dizinin orijinal i├žeri─či de─či┼čtirildikten sonra ve hatta ├ž├Âp toplama i┼člemi ba┼člamadan ├Ânce bile bellekte bulunmaz.

G├╝venlik nedeniyle, ┼čifreyi karakter dizisi olarak saklamak daha iyidir.


12







Bu ama├žla String kullanman─▒z veya Char [] kullanman─▒z gerekip gerekmedi─či tart─▒┼č─▒labilir ├ž├╝nk├╝ hem avantajlar─▒ hem de dezavantajlar─▒ vard─▒r. Bu kullan─▒c─▒n─▒n ihtiya├ž duydu─ču ┼čeylere ba─čl─▒d─▒r.

Java'daki Dizeler de─či┼čmez oldu─ču i├žin, baz─▒lar─▒n─▒z dizginizi de─či┼čtirmeye ├žal─▒┼čt─▒─č─▒nda, yeni bir Nesne yarat─▒r ve mevcut Dize etkilenmez. Bu, bir parolay─▒ String olarak kaydetmenin bir avantaj─▒ olarak g├Âr├╝lebilir, ancak nesne kullan─▒mdan sonra bile bellekte kal─▒r. B├Âylece, e─čer biri bir ┼čekilde nesnenin haf─▒zas─▒na sahipse, bu ki┼či o yerde saklanan ┼čifrenizi kolayca izleyebilir.

Char [] de─či┼čkendir, ancak kullan─▒mdan sonra programc─▒n─▒n diziyi a├ž─▒k├ža temizleyebilmesi veya de─čerleri ge├žersiz k─▒labilece─či avantaj─▒na sahiptir. Bu y├╝zden kullan─▒ld─▒─č─▒nda temizlenir ve saklad─▒─č─▒n─▒z bilgileri kimse bilemez.

Yukar─▒daki ko┼čullara dayanarak, dize ile gitmek ya da gereksinimleri i├žin Char [] ile gitmek gibi bir fikir olabilir.


2



─░lgili yay─▒nlar


S├Âzl├╝k neden C# Hashtable'da tercih edilir?

Yakalanmam─▒┼č Hata: De─či┼čmeyen ─░hlal: ├ľ─če t├╝r├╝ ge├žersiz: bir dize (yerle┼čik bile┼čenler i├žin) veya bir s─▒n─▒f / i┼člev bekleniyor ancak got: object

Neden hi├ž kimse Java i├žin make kullanm─▒yor?

Ruby'de bir ip olu┼čtururken neden k├╝rek operat├Âr├╝ (<<) art─▒-e┼čittir (+ =) yerine tercih edilir?

C++ initializer_list davran─▒┼č─▒ neden std :: vector ve std :: array i├žin farkl─▒?

Referans─▒m i├žin Yerel Kopyala ├Âzelli─či neden devre d─▒┼č─▒ b─▒rak─▒ld─▒?

├ľzel durum s─▒n─▒f─▒n─▒n bir veri k├╝mesini olu┼čtururken neden ÔÇťVeri setinde depolanan t├╝r i├žin kodlay─▒c─▒ bulunam─▒yorÔÇŁ?

Neden foreach, Scala Options i├žin oldu─čundan daha iyidir?

CAST kullan─▒rken neden VARCHAR'─▒n varsay─▒lan uzunlu─ču 30?

─░mzal─▒ bir tamsay─▒y─▒ iktidardan ay─▒rmak i├žin neden bu kadar karma┼č─▒k kod yay─▒nlan─▒yor?

Etiketle ilgili di─čer sorular [java]


Node.js ile bir komut sat─▒r─▒ ikili ├žal─▒┼čt─▒rma

PHP T_PAAMAYIM_NEKUDOTAYIM mi bekliyor?

JQuery'de onay kutusu de─čerini al─▒n

LINQ sorgular─▒nda ToList () veya ToArray () ├Â─česini ├ža─č─▒rmak daha m─▒ iyidir?

.NET kodunu tersine m├╝hendislikten korumak ister misiniz?

C# i├žindeki ÔÇťinternalÔÇŁ anahtar kelimesi i├žin pratik kullan─▒mlar

Regex ┼čifresi, en az sekiz karakter, en az bir say─▒ ve hem k├╝├ž├╝k hem de b├╝y├╝k harfler ve ├Âzel karakterler i├žermelidir

Bir dizgenin Python'da kendisini tekrar edip etmedi─čini nas─▒l anlar─▒m?

PHP'de tarih damgas─▒na tarih nas─▒l d├Ân├╝┼čt├╝r├╝l├╝r?

Neden java.util.logging kullanm─▒yorsunuz?