JavaRush /Java Blog /Random-ID /T&J: Mengapa lebih baik menyimpan kata sandi di Java dala...

T&J: Mengapa lebih baik menyimpan kata sandi di Java dalam array karakter daripada String?

Dipublikasikan di grup Random-ID
Anda mungkin mendengar pertanyaan seperti itu dalam sebuah wawancara untuk posisi Java Junior. Namun teman saya ditanyai hal ini saat wawancara untuk posisi Technical Lead.
T&J: Mengapa lebih baik menyimpan kata sandi di Java dalam array karakter daripada String?  - 1
Baik String, dan array karakter dapat digunakan untuk menyimpan data teks. Namun secara sadar memilih satu atau yang lain untuk tugas tertentu sulit dilakukan jika Anda belum pernah menghadapi situasi serupa. Namun, seperti yang teman saya tunjukkan, pertanyaan apa pun yang terkait dengan String, biasanya melibatkan properti string khusus yang disebut kekekalan ( Immutable), dan dia memanfaatkannya dalam wawancara. Jadi, mari kita lihat beberapa alasan mengapa Anda harus menggunakan char [], dan bukan , untuk menyimpan kata sandi Anda String.

Alasan 1. String tidak dapat diubah

Karena string tidak dapat diubah di Java, kata sandi teks biasa Anda akan tersedia di memori hingga pengumpul sampah menghapusnya. Dan karena Stringdigunakan String poolberulang kali, ada kemungkinan besar bahwa kata sandi akan tetap tersimpan dalam memori untuk waktu yang lama, dan ini sama sekali tidak aman.
Java String pool adalah kumpulan atau kumpulan objek (string) yang terletak di tempat khusus – heap. String di Java adalah salah satu tipe data yang paling umum. Ini bukan tipe primitif, tetapi sebuah objek, karena sangat intensif sumber daya. Jadi, untuk menyimpan string empat karakter, Anda perlu mengalokasikan memori 56 byte. Inilah sebabnya string, seperti objek lainnya, disimpan di heap.
Siapa pun yang memiliki akses ke dump memori dapat menemukan kata sandi dalam teks biasa, yang merupakan alasan bagus untuk menggunakan kata sandi terenkripsi daripada teks biasa. Karena string tidak dapat diubah, maka isinya tidak dapat diubah. Setiap perubahan akan membuat baris baru. Namun dalam kasus char [], Anda dapat mengganti elemen mana pun dengan nol atau karakter kosong. Oleh karena itu, menyimpan kata sandi dalam array karakter jelas mengurangi risiko intersepsi kata sandi.

Alasan 2. Rekomendasi penulis

Java sendiri (tentu saja melalui pembuatnya) merekomendasikan penggunaan metode getPassword ()dari kelas JPasswordFieldyang mengembalikan char []. Anda juga dapat mencoba metode yang tidak digunakan lagi getText (). Mengapa tidak mengikuti rekomendasi dari penulis bahasa?

Alasan 3. Cetak

Dengan suatu tipe Stringselalu ada bahaya bahwa teks yang disimpan dalam string akan dicetak di file log atau di konsol. Pada saat yang sama, jika Anda menggunakan Array, Anda tidak akan mencetak isi array, tetapi hanya lokasinya di memori. Tentu saja, ini bukan alasan yang serius, namun tetap masuk akal.
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
Tentu saja, menggunakan char []Java untuk menyimpan kata sandi bukanlah obat mujarab. Anda perlu mengambil tindakan pencegahan keamanan, seperti bekerja dengan hash dan mengenkripsi kata sandi daripada menyimpannya dalam teks biasa. Dan tentu saja, hapus dari memori segera setelah prosedur otentikasi. Berdasarkan materi dari Javarevisited
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION