it-swarm-id.com

Menghapus objek Java dengan aman

Saya tahu bahwa untuk menghapus objek Java saya harus menggunakan array karakter alih-alih String, karena saya dapat dengan aman menghapus (menulis ulang array karakter dengan data lain) isinya. layak untuk objek String.

Sekarang di BlackBerry yang Java, saya tidak dapat menemukan API untuk menangani data sebagai array karakter tetapi saya berkewajiban untuk menggunakan String. Jadi pertanyaan saya, jika saya menyimpan kata sandi di sebuah objek, bagaimana saya bisa menghapusnya dengan aman?

33
smiley

Sebenarnya Anda tidak dapat benar-benar "menghapus dengan aman" array karakter di Jawa. Java melakukan alokasi memori melalui pengumpul sampah , perangkat lunak yang rumit, yang dalam praktiknya, akan memindahkan objek memori dalam fisik RAM secara teratur. Jadi apa yang Anda pikirkan sebagai "contoh char[]" Akan disalin di beberapa tempat, dan penghapusan secara fisik akan terjadi hanya di salah satu tempat itu.

Dalam konteks itu, "penghapusan aman" tidak bisa benar-benar ada di Jawa. Jika Anda menggunakan Java, Anda harus memastikan bahwa konteks penggunaannya sedemikian rupa sehingga penghapusan aman tidak diperlukan: "penghapusan aman" diperlukan sebagian besar ketika OS dapat mengalokasikan blok-blok RAM yang tidak di-nolkan (sehingga aplikasi mungkin mendapatkan kutipan-kutipan lama) RAM dari aplikasi lain), atau di hadapan memori virtual (bagian dari RAM disalin ke hard disk). Saya kira ini tidak berlaku untuk BlackBerry, jadi contoh String yang sederhana seharusnya baik-baik saja.

Cara lain untuk menyatakannya adalah jika String instance adalah tidak baik untuk kata sandi, maka Anda memiliki masalah keamanan yang lebih besar daripada kebocoran kata sandi belaka . Setelah semua, Anda menggunakan kata sandi untuk melindungi akses ke beberapa data, jadi jika Anda memerlukan "penghapusan aman" untuk kata sandi, maka, secara logis, Anda juga akan perlu "penghapusan aman" untuk data yang dilindungi juga, dan semua yang Anda lakukan dengan itu.

(Orang bisa menebak bahwa saya bukan penggemar konsep "penghapusan aman".)

43
Thomas Pornin

jika saya menyimpan kata sandi di suatu objek, bagaimana saya bisa menghapusnya dengan aman?

Saya pikir maksud Anda; bagaimana Anda bisa mencegah penyerang dengan akses ke perangkat dari memulihkan kata sandi?

Itu tergantung pada tingkat akses yang telah diperoleh penyerang.

Jika penyerang terbatas pada API eksternal yang Anda berikan (bukan asumsi yang baik), maka kontrol akses menggunakan Java.security.AccessController harus cukup. Jika Anda mendesain kontrol akses dengan benar (sangat sulit dilakukan) dan penyerang tidak dapat mem-bypass kontrol akses, maka kontrol akses akan mencegah penyerang mendapatkan data.

Jika penyerang terbatas untuk beroperasi di dalam mesin virtual Java tetapi bukan API Anda, Anda perlu melindungi data dengan KeyStore.PrivateKeyEntry. Pada level ini Anda tidak dapat mengandalkan operasi yang tepat dari desain Anda untuk melindungi data dan Anda harus bergantung pada mesin virtual Java untuk memberikan perlindungan.

Jika penyerang terbatas pada sistem operasi (bukan Java mesin virtual) maka Anda tidak dapat melindungi data Anda. Jika penyerang dapat mencegah Java Virtual mesin beroperasi seperti yang dirancang, maka penyerang dapat memotong setiap Java mekanisme keamanan.

Jika penyerang memiliki akses fisik ke perangkat, tidak mungkin melindungi data terhadap semua serangan. Pada level ini penyerang dapat membaca data saat sedang ditulis ke RAM, flash, modul perangkat keras, dll.

6
this.josh